793

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

これを効率的に行うにはどうすればよいですか?

4

9 に答える 9

1090

上記の回答のPython3.6バージョン。-を使用して、次の変数のオブジェクトosとしてディレクトリパスがあると仮定します。strdirectory_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)
  • rglobに置き換えるためglob('**/*.asm')に使用rglob('*.asm')
    • これは、指定された相対パターンの前に追加してPath.glob()呼び出すようなものです。'**/'
from pathlib import Path

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

元の答え:

import os

for filename in os.listdir("/path/to/dir/"):
    if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
        continue
    else:
        continue
于 2012-04-30T03:01:13.150 に答える
191

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

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)
于 2015-05-15T08:51:39.993 に答える
167

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

于 2012-04-30T03:06:20.340 に答える
60

Python 3.5以降、os.scandir()を使用すると作業がはるかに簡単になり、2〜20倍高速になります(ソース)。

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つだけ必要です。

于 2019-06-06T01:31:56.537 に答える
21

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

于 2015-11-17T13:21:18.317 に答える
13

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

これらの手法のいずれも、反復の注文を保証しません

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

于 2018-08-14T21:34:08.953 に答える
9

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)
于 2019-06-25T05:20:15.533 に答える
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)
于 2016-09-02T15:49:27.020 に答える
3

ライブラリ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.")
于 2019-06-18T16:27:38.903 に答える