Вопрос-Ответ

How can I iterate over files in a given directory?

Как я могу выполнять итерации по файлам в заданном каталоге?

Мне нужно перебрать все .asm файлы внутри данного каталога и выполнить с ними некоторые действия.

Как это можно сделать эффективным способом?

Переведено автоматически
Ответ 1

Версия приведенного выше ответа на 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)

  • Используйте 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
Ответ 2

Это приведет к перебору всех файлов-потомков, а не только непосредственных дочерних элементов каталога:

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

Вы можете попробовать использовать модуль 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, хотя результаты возвращаются в произвольном порядке. Расширение тильды не выполняется, но *, ?, и диапазоны символов, выраженные с помощью [], будут правильно подобраны.


Ответ 4

Начиная с 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)

Использование scandir() вместо listdir() может значительно повысить
производительность кода, которому также требуется тип файла или атрибут file
информация, поскольку os.Объекты DirEntry предоставляют эту информацию, если
операционная система предоставляет ее при сканировании каталога. Все
методы os.DirEntry могут выполнять системный вызов, но is_dir() и
is_file() обычно требуют системного вызова только для символьных ссылок;
os.DirEntry.stat() всегда требует системного вызова в Unix, но только
требуется для символьных ссылок в Windows.


python