特定のディレクトリのファイルをどのように反復できますか?


555

.asm特定のディレクトリ内のすべてのファイルを反復処理し、それらに対していくつかのアクションを実行する必要があります。

これをどのように効率的に行うことができますか?

回答:


807

元の答え:

import os

for filename in os.listdir(directory):
    if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
        continue
    else:
        continue

上記の答えのPython 3.6バージョンを使用してos- strと呼ばれる変数のオブジェクトとしてディレクトリパスがあると仮定しますdirectory_in_str

import os

directory = os.fsencode(directory_in_str)

for file in os.listdir(directory):
     filename = os.fsdecode(file)
     if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
         continue
     else:
         continue

または再帰的にpathlib

from pathlib import Path

pathlist = Path(directory_in_str).glob('**/*.asm')
for path in pathlist:
     # because path is object not string
     path_in_str = str(path)
     # print(path_in_str)

1
これは、ディレクトリの直下にあるディレクトリまたはファイルを一覧表示するようです。以下のpedromateoによる答えは、再帰的なリストを行うようです。
Jay Sheth、2016年

8
Python 3.6では、ディレクトリはバイト単位であると想定されているため、listdirはファイル名のリストをバイト単位のデータ型でも出力するため、endwithを直接実行することはできません。このコードブロックは次のように変更する必要がありますdirectory = os.fsencode(directory_in_str) for file in os.listdir(directory): filename = os.fsdecode(file) if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue
Kim Stacks

13
print(os.path.join(directory, filename))print(os.path.join(directory_in_str, filename))Python 3.6で動作するように変更する必要があります
Hugo Koopmans

54
これが2017年以降に見られる場合は、os.scandir(dir_str)が利用可能になり、使用方法が大幅に改善されました。fsencodeは必要ありません。for entry in os.scandir(path): print(entry.path)
ヤギ

2
優先if filename.endswith((".asm", ".py")):if filename.endswith(".asm") or filename.endswith(".py"):
Maroloccio

152

これにより、ディレクトリの直接の子だけでなく、すべての子孫ファイルが繰り返されます。

import os

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".asm"):
            print (filepath)

3
os.walk関数のリファレンスは、次の場所にあります。docs.python.org
2

136

あなたはglobモジュールを使ってみることができます:

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)

Python 3.5以降では、サブディレクトリも検索できます:

glob.glob('**/*.txt', recursive=True) # => ['2.txt', 'sub/3.txt']

ドキュメントから:

結果は任意の順序で返されますが、globモジュールは、Unixシェルが使用するルールに従って、指定されたパターンに一致するすべてのパス名を見つけます。チルダ展開は行われませんが、*、?、および[]で表される文字範囲は正しく一致します。


19

Python 3.5以降では、os.scandir()を使用する方がはるかに簡単です。

with os.scandir(path) as it:
    for entry in it:
        if entry.name.endswith(".asm") and entry.is_file():
            print(entry.name, entry.path)

listdir()の代わりにscandir()を使用すると、オペレーティングシステムがディレクトリのスキャン時に提供する場合、os.DirEntryオブジェクトがこの情報を公開するため、ファイルタイプまたはファイル属性情報も必要とするコードのパフォーマンスを大幅に向上させることができます。すべてのos.DirEntryメソッドはシステムコールを実行できますが、is_dir()およびis_file()は通常、シンボリックリンクのシステムコールのみを必要とします。os.DirEntry.stat()は、Unixでは常にシステムコールを必要としますが、Windowsではシンボリックリンクに対してのみ必要です。


entryある posix.DirEntryのような便利な方法の束を持つタイプはentry.is_dir()is_file()is_symlink()
crypdick

17

Python 3.4以降では、標準ライブラリでpathlibが提供れています。あなたがすることができます:

from pathlib import Path

asm_pths = [pth for pth in Path.cwd().iterdir()
            if pth.suffix == '.asm']

または、リスト内包表記が気に入らない場合:

asm_paths = []
for pth in Path.cwd().iterdir():
    if pth.suffix == '.asm':
        asm_pths.append(pth)

Path オブジェクトは簡単に文字列に変換できます。


9

Pythonでファイルを反復処理する方法は次のとおりです。

import os

path = 'the/name/of/your/path'

folder = os.fsencode(path)

filenames = []

for file in os.listdir(folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...
        filenames.append(filename)

filenames.sort() # now you have the filenames and can do something with them

これらの手法のどれも、いかなる反復順序も保証しません

うん、超予測できない。ファイル名を並べ替えていることに注意してください。これは、ファイルの順序が重要な場合、つまりビデオフレームや時間に依存するデータ収集の場合に重要です。ただし、ファイル名には必ずインデックスを付けてください。


常にソートされるとは限りません... im1、im10、im11 ...、im2 ...それ以外の場合は便利なアプローチ。from pkg_resources import parse_versionそしてfilenames.sort(key=parse_version)それを やった。
Hastur

5

globを使用して、ディレクトリとリストを参照できます。

import glob
import os

#to get the current working directory name
cwd = os.getcwd()
#Load the images from images folder.
for f in glob.glob('images\*.jpg'):   
    dir_name = get_dir_name(f)
    image_file_name = dir_name + '.jpg'
    #To print the file name with path (path will be in string)
    print (image_file_name)

配列内のすべてのディレクトリのリストを取得するには、osを使用できます。

os.listdir(directory)

4

私はまだこの実装に満足していませんDirectoryIndex._make(next(os.walk(input_path)))。ファイルリストを表示したいパスを渡すことができるようにするカスタムコンストラクターが必要でした。編集を歓迎します!

import collections
import os

DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files'])

for file_name in DirectoryIndex(*next(os.walk('.'))).files:
    file_path = os.path.join(path, file_name)

2

ライブラリにscandir組み込まれているディレクティブを使用するのが本当に好きosです。これが実際の例です:

import os

i = 0
with os.scandir('/usr/local/bin') as root_dir:
    for path in root_dir:
        if path.is_file():
            i += 1
            print(f"Full path is: {path} and just the name is: {path.name}")
print(f"{i} files scanned successfully.")

重複回答
クリプディック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.