Как я могу перебирать файлы в заданном каталоге?
Мне нужно выполнить итерацию через все .asm
файлы внутри заданного каталога и выполнить некоторые действия над ними.
Как это можно сделать эффективным образом?
Ответы
Ответ 1
Оригинальный ответ:
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)
Ответ 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.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
могут быть легко преобразованы в строки.
Ответ 5
Вот как я перебираю файлы в 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
НИКАКАЯ ИЗ ЭТИХ ТЕХНИК НЕ ГАРАНТИРУЕТ НИКАКОГО ЗАКАЗА Итераций
Да, супер непредсказуемый. Обратите внимание, что я сортирую имена файлов, что важно, если порядок файлов имеет значение, т.е. для видеокадров или сбора данных, зависящих от времени. Не забудьте поставить индексы в ваших именах файлов, хотя!
Ответ 6
Я еще не совсем доволен этой реализацией, я хотел иметь собственный конструктор, который делает 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)
Ответ 7
Начиная с 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)
Использование scandir() вместо listdir() может значительно повысить производительность кода, который также нуждается в информации о типе файла или атрибуте файла, поскольку объекты os.DirEntry предоставляют эту информацию, если операционная система предоставляет ее при сканировании каталога. Все методы os.DirEntry могут выполнять системный вызов, но для is_dir() и is_file() обычно требуется только системный вызов для символических ссылок; os.DirEntry.stat() всегда требует системного вызова в Unix, но требует только одного для символических ссылок в Windows.
Ответ 8
Мне действительно нравится использовать директиву 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.")
Ответ 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)