Получение списка файлов в директории на Python
Всё чаще современные программисты предпочитают работать с языком программирования Python, потому что он очень гибкий, позволяющий легко взаимодействовать с операционной системой. Он также поставляется с функциями по работе с файловой системой. Решение задачи распечатки списка файлов в директории можно решить используя разные модули: os, subprocess, fnmatch и pathlib. Следующие решения демонстрируют, как успешно воспользоваться этими модулями.
Применение os.walk()
Модуль os содержит длинный список методов, которые касаются работы с файловой системой и операционной системой. Один из них walk(), возвращающий имена файлов в дереве каталогов, двигаясь по дереву сверху вниз или снизу вверх (сверху вниз по умолчанию).
os.walk() возвращает список из трех элементов: имя корневого каталога, список имен вложенных папок и список файлов в текущем каталоге. Он одинаково хорошо работает с интерпретаторами Python 2 и 3.
import os for root, dirs, files in os.walk("."): for filename in files: print(filename)
Использование командной строки, через subprocess
Модуль subprocess позволяет выполнить системную команду и собрать её результат. В нашем случае вызываемая системная команда выглядит следующим образом:
$ ls -p . | grep -v /$
Инструкция ls -p . распечатывает список файлов текущего каталога, добавляя разделитель / в конце имени каждого подкаталога, которые нам понадобится на следующем шаге. Вывод этого вызова передается команде grep, которая отфильтровывает данные по мере поступления. Параметры -v / $ исключают все имена записей, которые заканчиваются разделителем /. Фактически / $ — регулярное выражение, которое соответствует всем строкам, содержащим символ / самым последним символом в строке, который определяется символом $.
Модуль subprocess позволяет строить настоящие конвейеры, а также соединять входные и выходные потоки, как это делается в командной строке. Вызов метода subprocess.Popen() открывает соответствующий процесс и определяет два параметра stdin и stdout.
Первая переменная ls определяет процесс выполнения ls –p для захвата stdout в конвейере. Поэтому поток stdout определяется как subprocess.PIPE. Вторая переменная grep также определяется как процесс, но вместо этого выполняет инструкцию grep –v /$.
Чтобы прочитать вывод команды ls из конвейера, поток stdin grep присваиваивается в ls.stdout. В заключение, переменная endOfPipe считывает вывод команды grep из grep.stdout, затем распечатывается в stdout циклом for.
import subprocess # определение команды ls ls = subprocess.Popen(["ls", "-p", "."], stdout=subprocess.PIPE, ) # определение команды grep grep = subprocess.Popen(["grep", "-v", "/$"], stdin=ls.stdout, stdout=subprocess.PIPE, ) # чтение из данных из потока stdout endOfPipe = grep.stdout # распечатка файлов в строку for line in endOfPipe: print(line)
$ python find-files3.py find-files2.py find-files3.py find-files4.py .
Данное решение работает достаточно хорошо с Python 2 и 3, но его можно улучшить. Рассмотрим другие варианты.
Комбинация os и fnmatch
Решение, использующее подпроцессы, элегантно, но требует большого количества кода. Вместо этого, давайте объединим методы из двух модулей os и fnmatch. Этот вариант также работает с Python 2 и 3.
В качестве первого шага, импортируем модули os и fnmatch. Далее определим каталог, в котором нужно перечислить файлы, используя os.listdir(), а также шаблон для фильтрации файлов. В цикле for выполняется итерация списка записей, хранящихся в переменной listOfFiles.
В завершение, с помощью fnmatch отфильтровываются искомые записи и распечатываются соответствующие записи в stdout.
import os, fnmatch listOfFiles = os.listdir('.') pattern = "*.py" for entry in listOfFiles: if fnmatch.fnmatch(entry, pattern): print(entry)
$ python find-files.py find-files.py find-files2.py find-files3.py .
Использование os.listdir() и генераторов
Следующий вариант объединяет метод os.listdir() с функцией генератором. Код работает как с версиями 2, так и с 3 Python.
Как уже было сказано ранее, listdir() возвращает список записей для данного каталога. Метод os.path.isfile() возвращает True, если данная запись является файлом. Оператор yield завершает работу функции, но сохраняя текущее состояние и возвращает только имя записи являющейся файлом.
import os def files(path): for file in os.listdir(path): if os.path.isfile(os.path.join(path, file)): yield file for file in files("."): print(file)
Использование pathlib
Модуль pathlib предназначен для парсинга, сборки, тестирования и иной работы с именами файлов и их путями, используя объектно-ориентированный API вместо низкоуровневых строковых операций. Начиная с Python 3 модуль находится в стандартной библиотеке.
В следующем листинге определяется текущий каталог точкой («.»). Затем метод iterdir() возвращает итератор, который возвращает имена всех файлов. Далее циклом for распечатываются имена файлов друг за другом.
import pathlib # определение пути currentDirectory = pathlib.Path('.') for currentFile in currentDirectory.iterdir(): print(currentFile)
В качестве альтернативы, можно отфильтровать файлы по именам с помощью метода glob. Таким образом, получаем требуемые файлы. Например, в приведенном ниже коде перечисляются Python файлы в выбранном каталоге, указав шаблон «*.py» в glob.
import pathlib # определение пути currentDirectory = pathlib.Path('.') # определение шаблона currentPattern = "*.py" for currentFile in currentDirectory.glob(currentPattern): print(currentFile)
Использование os.scandir()
В Python 3.6 добавлен новый метод scandir(), доступный из модуля os. Как понятно из названия он значительно упрощает получение списка файлов в каталоге.
Чтобы определить текущий рабочий каталог и сохранить его, инициализируем значение переменной path, для этого импортируем модуль os и вызовем функцию getcwd(). Далее, scandir() возвращает список записей для выбранного пути, которые проверяются на принадлежность файлу, используя метод is_file().
import os # определение текущей рабочей директории path = os.getcwd() # чтение записей with os.scandir(path) as listOfEntries: for entry in listOfEntries: # печать всех записей, являющихся файлами if entry.is_file(): print(entry.name)
Вывод
Ведутся споры, какой вариант является лучшим, какой наиболее элегантным и какой является наиболее «питоничным». Мне нравится простота метода os.walk(), а также модули fnmatch и pathlib.
Две версии с процессами/конвейером и итератором требуют более глубокого понимания процессов UNIX и знаний Python, поэтому они не могут быть предпочтительными для всех программистов из-за их дополнительной (и избыточной) сложности.
Чтобы найти ответ на этот вопрос, выберем самой быстрой из них, воспользовавшись удобным модулем timeit. Данный модуль подсчитывает время, прошедшее между двумя событиями.
Для сравнения всех решений без их изменений, воспользуемся функциональностью Python: вызовем интерпретатор с модулем timeit и соответствующим Python скриптом. Для автоматизации процесса напишем shell скрипт
#! /bin/bash for filename in *.py; do echo "$filename:" cat $filename | python3 -m timeit echo " " done
Тесты проводились с использованием Python 3.6. Среди всех тестов os.walk() показала себя наилучшим образом. Выполнение тестов с помощью Python 2 возвращает разные значения, но os.walk() по-прежнему находится на вершине списка.
Как читать txt файлы из определенной папки?
Допустим есть 10 txt файлов в одной папке (мне нужно что бы софт брал txt файлы именно с одной папки) и у файлов разные названия. Как сделать так что бы он прочитал все эти 10 файлов из одной папки?
Отслеживать
задан 10 янв в 8:50
1 2 2 бронзовых знака
пройтись циклом for или while
10 янв в 8:55
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Можно следующим образом, в функцию files передается путь по которому нужно искать файлы
import os def files(path): for file in os.listdir(path): if os.path.isfile(os.path.join(path, file)): yield file for file in files("."): file_info = file.split('.') if file_info[1] == 'txt': print(file) # здесь делаете действие над файлом
Отслеживать
ответ дан 10 янв в 9:00
Clark Devlin Clark Devlin
1,393 1 1 золотой знак 13 13 серебряных знаков 30 30 бронзовых знаков
для этого используйте модуль os , который позволяет забирать название файлов в указаной папке.
import os for filename in os.listdir("path_to_folder"): print(filename)
для чтения самих файлов используйте with
for filename in os.listdir("path_to_folder"): with open("path_to_folder\\" + filename) as file: txt_includes = file.readlines() print(txt_includes)
Можно отделить файлы от папок и работать только с файлами, если вдруг окажется папка, где ее быть не должно
path_to_folder = "path_to_folder" for filename in os.listdir(path_to_folder): path_to_file = path_to_folder + "\\" + filename if os.path.isfile(path_to_file): with open(path_to_file) as file: txt_includes = file.readlines() print(txt_includes)
Список каталогов и список файлов в каталоге на Python

В этом уроке я расскажу вам о нескольких способах составления списка каталогов в Python, позволяющих получить имена всех файлов и папок.
Для примера возьмем каталог с содержимым, которое выглядит следующим образом:
Code language: JavaScript (javascript)+ Example |_ + dir_a |_ file2.txt |_ file3.txt |_ + dir_b |_ file4.txt |_ document.txt |_ file1.txt |_ image.jpg
Список каталогов в Python с помощью функции listdir()
Чтобы просмотреть каталог в Python, просто используйте функцию listdir() модуля os.
Эта функция принимает в качестве аргумента путь к расположению директории и возвращает список имен файлов и папок, которые она содержит. Если аргумент не передан, то в качестве ссылки используется текущая папка.
Code language: JavaScript (javascript)import os content = os.listdir('/Users/Admin/Example') print(content)
Code language: JSON / JSON with Comments (json)['document.txt', 'image.jpg', 'dir_b', 'file.txt', 'dir_a']
Проблема с использованием функции listdir() заключается в том, что она не позволяет отличить, являются ли перечисленные объекты файлами или каталогами.
Для этого нам необходимо использовать другие функции, такие как isfile() или isdir() из модуля os.path.
Например, чтобы отобразить файлы типа jpg, можно сделать следующее:
Code language: JavaScript (javascript)import os example_dir = '/Users/Admin/Example/' content = os.listdir(example_dir) images = [] for file in content: if os.path.isfile(os.path.join(example_dir, file)) and file.endswith('.jpg'): images.append(file) print(images)
Результат выполнения приведенного выше кода над тестовым каталогом следующий:
Code language: JSON / JSON with Comments (json)['image.jpg']
Обход каталога в Python с помощью функции scandir()
Если вам необходимо каким-то образом отфильтровать элементы, возвращаемые функцией listdir(), лучшим способом обхода каталога в Python является использование функции scandir(), также содержащейся в модуле os.
ПРИМЕЧАНИЕ: Эта функция была добавлена в Python версии 3.5. В настоящее время это рекомендуемый Python способ обхода каталога.
Эта функция на самом деле действует как итератор, а не возвращает список.
Более того, она не только извлекает имена файлов, но и возвращает объекты DirEntry, которые, помимо имени, содержат другие атрибуты, указывающие на то, является ли объект файлом, каталогом, его номер inode или полный путь.
Рассмотрим пример использования функции scandir() для перечисления файлов в каталоге в Python:
Code language: JavaScript (javascript)import os example_dir = '/Users/Admin/Example/' with os.scandir(example_dir) as files: for file in files: print(file.name)
В результате мы получим следующее:
Code language: CSS (css)document.txt image.jpg dir_b file1.txt dir_a
Как вы видите, scandir() используется в сочетании с оператором with, поскольку он поддерживает обработчики контекста.
Когда scandir() выполняется вместе с with, итератор закрывается, а все ресурсы, используемые итератором, освобождаются после его завершения.
Перечисление файлов в каталоге с помощью функции iterdir()
Еще одним модулем Python, предоставляющим функциональность для перебора каталогов и просмотра их содержимого, является модуль pathlib.
Этот модуль предлагает ряд объектов и свойств, которые позволяют выполнять наиболее распространенные операции над файлами и каталогами простым и эффективным способом.
Чтобы перечислить каталог с помощью pathlib, мы должны создать объект Path, который, в зависимости от используемой операционной системы, будет иметь тип PosixPath или WindowsPath.
Эти объекты Path имеют метод iterdir(), который создает итератор, проходящий через все файлы и папки в каталоге.
Кроме того, объекты класса Path содержат такие свойства, как name, с именем файла, и такие методы, как is_file() или is_dir(), которые позволяют проверить, является ли он файлом или каталогом.
Вот пример использования pathlib:
Code language: JavaScript (javascript)import pathlib example_dir = '/Users/Admin/Example/' dir = pathlib.Path(example_dir) for file in dir.iterdir(): print(file.name)
В результате мы получим:
Code language: CSS (css)document.txt image.jpg dir_b file1.txt dir_a
Рекомендуемые методы
Теперь, когда мы рассмотрели три различных способа обхода каталога в Python, отмечу, что рекомендуемые варианты – это использование функции scandir() или метода iterdir() в pathlib.
Примеры
Далее мы увидим, как применять фильтры для просмотра только файлов, только определенных файлов или только подкаталогов данного каталога.
Recorrer los ficheros de un directorio con scandir
Code language: JavaScript (javascript)import os example_dir = '/Users/Admin/Example/' with os.scandir(example_dir) as files: files = [file.name for files in files if file.is_file()] print(files)
Code language: JSON / JSON with Comments (json)['document.txt', 'image.jpg', 'file1.txt']
Чтобы просмотреть только файлы jpg, можно добавить еще одно условие:
Code language: JavaScript (javascript)with os.scandir(example_dir) as files: files = [file.name for file in files if file.is_file() and file.name.endswith('.jpg')]
Обход файлов в каталоге с помощью iterdir
Code language: JavaScript (javascript)import pathlib example_dir = '/Users/Admin/Example/' dir = pathlib.Path(example_dir) files = [file.name for file in dir.iterdir() if file.is_file()]
Список подкаталогов каталога с помощью scandir
Code language: JavaScript (javascript)import os example_dir = '/Users/Admin/Example/' with os.scandir(example_dir) as files: subdir = [file.name for file in files if file.is_dir()] print(subdir)
Code language: JSON / JSON with Comments (json)['dir_b', 'dir_a']
Список подкаталогов каталога с помощью iterdir
Code language: JavaScript (javascript)import pathlib example_dir = '/Users/Admin/Example/' dir = pathlib.Path(example_dir) files = [file.name for file in dir.iterdir() if file.is_dir()]
Подсчитайте количество файлов в данной директории (папке) и выведите на экран
1. Пусть дана некоторая директория (папка). Подсчитайте количество файлов в данной
директории (папке) и выведите на экран.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Подсчитайте и выведите на экран количество пятерок полученных за год
ученик изучает англ. язык 4 раза в неделю и 34 уч. недели. Оценки ученика случайны (с2 до 5).
Выведите на экран все чётные числа от 2 до n включительно и подсчитайте их количество
Дана задача написать листинг задачу вывести на экран все чётные числа от 2 до n включительно и.

Реализовать вывод на экран списка каталогов и файлов в данной папке
Прошу помочь с написанием кода, с файлами только начал работать и не совсем понимаю, как.
94 / 63 / 33
Регистрация: 08.02.2021
Сообщений: 193
1 2 3 4 5
import os directory = 'your/path' files = os.listdir(directory) print(len(files))
Am I evil? Yes, I am!
![]()
![]()
16119 / 9755 / 2730
Регистрация: 21.10.2017
