現在のディレクトリ内のファイルのみを一覧表示します


225

Pythonでは、現在のディレクトリにあるすべてのファイルのみを一覧表示します。サブディレクトリまたは親からファイルをリストしたくない。

そこに同様の解決策があるように見えますが、それらは私にはうまくいかないようです。これが私のコードスニペットです:

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

現在のディレクトリ内にholygrail.pyとTimの2つのファイルがあるとします。私にもフォルダがあり、その中に2つのファイル(ArthurとLancelotと呼びましょう)が含まれています。スクリプトを実行すると、次のようになります。

holygrail.py
Tim
Arthur
Lancelot

holygrail.pyとTimに満足しています。しかし、2つのファイル、ArthurとLancelotはリストに含めたくありません。

回答:


378

os.listdirとのos.path.isfile代わりにを使用してくださいos.walk

例:

import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something

ただし、これを他のディレクトリに適用するときは注意してください。

files = [f for f in os.listdir(somedir) if os.path.isfile(f)].

fはフルパスではなく、現在のディレクトリからの相対パスであるため機能しません。

したがって、別のディレクトリでフィルタリングするには、次のようにします。 os.path.isfile(os.path.join(somedir, f))

(ヒントの因果関係に感謝)


3
これが私が最後に必要なものです[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]
シティノーマン

2
これは彼の答えである: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
ジェフLuyet

64

os.listdirこの目的に使用できます。ディレクトリだけでなくファイルも必要な場合は、を使用して結果をフィルタリングできます。os.path.isfile

例:

files = os.listdir(os.curdir)  #files and directories

または

files = filter(os.path.isfile, os.listdir( os.curdir ) )  # files only
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] #list comprehension version.

20
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

3
一般的な解決策を提供してくれてありがとう(dirがcwdでない場合)。
jwg 2014年

10

使用できますos.scandir()。stdlibの新しい関数はPython 3.5から始まります。

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

よりも速いos.listdir()os.walk() 実装し os.scandir()ます。


5

これはos.walk()で実行できます

python 3.5.2がテストされました。

import os
for root, dirs, files in os.walk('.', topdown=True):
    dirs.clear() #with topdown true, this will prevent walk from going into subs
    for file in files:
      #do some stuff
      print(file)

dirs.clear()行を削除すると、サブフォルダー内のファイルが再び含まれます。

参照で更新;

ここにドキュメント化されたos.walkは、作成されるトリプルリストとトップダウン効果について話します。

リストを空にするためにここに記載されている.clear()

したがって、os.walkから関連リストをクリアすることで、その結果をニーズに合わせることができます。


4
import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

このコードを改善del dirs[:]すると、次のようになります。

import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

または、現在の作業ディレクトリでos.walkをポイントできる場合はさらに良いでしょう。

import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
    del dirs[:]  # remove the sub directories.
    for file in files:
      do some stuff
      print file


1

pathlibモジュールを使用できます。

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.