web-dev-qa-db-ja.com

特定のディレクトリ内のファイルを反復処理する方法

与えられたディレクトリ内のすべての.asmファイルを繰り返し処理し、それらに対していくつかの操作を行う必要があります。

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

387
Itzik984

元の回答:

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

os を使用した上記の回答のPython 3.6バージョン-directory_in_strという変数の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)
659
anselm

glob moduleを使ってみることができます。

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シェルで使用されている規則に従って、指定されたパターンに一致するすべてのパス名を見つけますが、結果は任意の順序で返されます。ティルダ展開は行われませんが、*、?、および[]で表される文字範囲は正しく一致します。

106
Doboy

これは、ディレクトリの直下の子だけでなく、すべての子孫ファイルを反復処理します。

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)
105
pedromateo

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オブジェクトは簡単に文字列に変換できます。

12
Greg

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

これらのテクニックのどれも繰り返し順序を保証しない

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

5
Daniel McGrath

私はまだこの実装には満足していません。ファイルリストが欲しいパスを渡すことができるように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)
4
ThorSummoner

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)
1
YAP

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.")
1
jamescampbell

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ではシンボリックリンクに対してのみシステムコールを必要とします。

1
crypdick