.asm
特定のディレクトリ内のすべてのファイルを反復処理し、それらに対していくつかのアクションを実行する必要があります。
これを効率的に行うにはどうすればよいですか?
上記の回答のPython3.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)
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
これにより、ディレクトリの直接の子だけでなく、すべての子孫ファイルが繰り返されます。
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)
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シェルで使用されるルールに従って、指定されたパターンに一致するすべてのパス名を検索しますが、結果は任意の順序で返されます。チルダ拡張は行われませんが、[]で表される*、?、および文字範囲は正しく一致します。
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つだけ必要です。
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
オブジェクトは簡単に文字列に変換できます。
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
これらの手法のいずれも、反復の注文を保証しません
うん、超予測不可能。ファイル名を並べ替えていることに注意してください。これは、ファイルの順序が重要な場合、つまりビデオフレームや時間依存のデータ収集の場合に重要です。ただし、ファイル名には必ずインデックスを付けてください。
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)
私はまだこの実装に満足していません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)
ライブラリ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.")