Как получить список файлов в папке python
Обновлено: 21.11.2024
В этой статье мы обсудим различные способы получения списка всех файлов в каталоге или папке вместе с размером в Python.
Оглавление
Получить список всех файлов в каталоге с размером, используя glob()
В Python модуль glob предоставляет функцию glob() для поиска файлов или каталогов в заданном каталоге на основе соответствующего шаблона. Подобно правилам расширения пути Unix, мы можем использовать подстановочные знаки и регулярные выражения для сопоставления и поиска нескольких или всех файлов в каталоге с помощью функции глобус(). Мы будем использовать это, чтобы получить список всех файлов в каталоге вместе с размером. Шаги следующие:
- Получить список всех файлов и каталогов в заданном каталоге с помощью функции glob().
- Используя функцию filter() и os.path.isfileIO(), выберите файлы только из списка.
- Для каждого файла в списке рассчитайте его размер и создайте список кортежей, т. е. список путей к файлам и размер.
Полный пример для получения списка файлов в каталоге с размером выглядит следующим образом,
Вывод:
Функция os.stat(file_path) возвращает объект, содержащий статистику файла. Мы можем получить атрибут st_size объекта статистики, то есть размер файла в байтах.
В приведенном выше решении мы создали список файлов в папке, а затем для каждого файла мы получили размер файла в байтах с помощью функции os.stat(), а затем создали список кортежей, то есть путь к файлу и размер файла. Но список содержит имена файлов вместе с размером в байтах.
Получить список имен файлов в каталоге с размером, используя os.listdir()
В Python модуль os предоставляет функцию listdir(dir_path), которая возвращает список имен файлов и каталогов в указанном пути к каталогу. Используя функцию filter() и os.path.isfileIO(), выберите файлы только из списка. Затем мы можем перебрать этот список имен файлов и получить размер каждого файла. Затем мы можем создать список кортежей, то есть имя файла и размер.
Полный пример для получения списка имен файлов в каталоге с размером выглядит следующим образом,
Вывод:
В этом решении мы создали список имен файлов в папке вместе с размером в байтах.
Python: получить список файлов в каталоге и подкаталогах с размером
В обоих предыдущих примерах мы создали список файлов в каталоге с размером. Но он охватывает файлы только в данном каталоге, а не во вложенных каталогах. Итак, если вы хотите получить список файлов в каталоге и подкаталоге с указанием размера, ознакомьтесь с этим примером,
Вывод:
Мы использовали функцию glob() с шаблоном ‘/**/*’ и рекурсивный аргумент со значением True. Он дал список всех файлов в данном каталоге и всех подкаталогах рекурсивно. Затем с помощью функции os.stat(file_path).st_size мы рассчитали размер каждого файла и создали список файлов вместе с размером.
Обзор:
Мы узнали о различных способах получения списка файлов в папке с размером.
Учебники по Pandas – изучите анализ данных с помощью Python
Вы хотите сделать карьеру в области Data Science с помощью Python?
Наука о данных — это будущее, и оно уже наступило. На сегодняшний день специалисты по данным являются самыми востребованными профессионалами. Чтобы стать хорошим Data Scientist или сменить профессию в Data Science, нужно обладать нужным набором навыков. Мы составили список лучших профессиональных сертификатов в области науки о данных с помощью Python. Эти курсы научат вас инструментам программирования для науки о данных, таким как Pandas, NumPy, Matplotlib, Seaborn, и тому, как использовать эти библиотеки для реализации моделей машинного обучения.
Ознакомьтесь с подробным обзором лучшего профессионального сертификата по науке о данных с Python.
Помните, что наука о данных требует большого терпения, настойчивости и практики. Итак, начните учиться сегодня.
Присоединяйтесь к сообществу разработчиков Python в LinkedIn
Похожие записи
Вставить элемент в начало массива NumPy
Как добавить столбцы в массив NumPy в Python
Как объединить массивы NumPy в Python?
Добавить строку в массив NumPy в Python
Добавить элементы в конец массива в Python
Как удалить столбцы из массива NumPy
Как удалить строки из массива NumPy
Удалить последний элемент из массива NumPy в Python
Удалить первый элемент из массива NumPy в Python
Проверьте, является ли двумерный массив NumPy или матрица симметричным
Редактировать значения ячеек в CSV-файлах с помощью Pandas в Python
Сортировка массива NumPy в порядке убывания в Python
Преобразование списка в набор в Python
Добавление двух элементов списка в Python
Добавление одного списка к другому списку в Python
Удалить дубликаты из массива NumPy в Python
Проверить, существует ли столбец в Pandas DataFrame
Проверить, равны ли два массива NumPy в Python
Pandas: проверьте, все ли значения в столбце равны нулю
Проверить, все ли значения в столбце являются NaN в Pandas
Оставить комментарий Отменить ответ
Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.
Реклама
Реклама
Последние сообщения
Учебники по Python
Что-то ищу
Учебники по C++/C++11
Условия использования
Условия и политика
Учебники по Python
Избранные сайты
Отказ от ответственности
Условия и политика
Авторское право © 2022 thisPointer
Техническое хранение или доступ строго необходимы для законных целей, позволяющих использовать конкретную услугу, явно запрошенную подписчиком или пользователем, или с единственной целью осуществления передачи сообщения по сети электронной связи.
Техническое хранение или доступ необходимы для законных целей хранения настроек, которые не запрашиваются подписчиком или пользователем.
Техническое хранилище или доступ, которые используются исключительно для статистических целей. Техническое хранилище или доступ, который используется исключительно для анонимных статистических целей. Без повестки в суд, добровольного согласия со стороны вашего интернет-провайдера или дополнительных записей от третьей стороны информация, хранящаяся или извлекаемая только для этой цели, обычно не может быть использована для вашей идентификации.
Техническое хранилище или доступ необходимы для создания профилей пользователей для отправки рекламы или отслеживания пользователя на веб-сайте или на нескольких веб-сайтах в аналогичных маркетинговых целях.
Техническое хранение или доступ строго необходимы для законных целей, позволяющих использовать конкретную услугу, явно запрошенную подписчиком или пользователем, или с единственной целью осуществления передачи сообщения по сети электронной связи.
Техническое хранение или доступ необходимы для законных целей хранения настроек, которые не запрашиваются подписчиком или пользователем.
Техническое хранилище или доступ, которые используются исключительно для статистических целей. Техническое хранилище или доступ, который используется исключительно для анонимных статистических целей. Без повестки в суд, добровольного согласия со стороны вашего интернет-провайдера или дополнительных записей от третьей стороны информация, хранящаяся или извлекаемая только для этой цели, обычно не может быть использована для вашей идентификации.
Техническое хранилище или доступ необходимы для создания профилей пользователей для отправки рекламы или отслеживания пользователя на веб-сайте или на нескольких веб-сайтах в аналогичных маркетинговых целях.
Библиотека ОС Python используется для отображения списка файлов в каталоге. Метод Python os.listdir() возвращает список всех файлов и папок в каталоге. Функция os.walk() возвращает список всех файлов во всем файловом дереве.
Часто, когда вы работаете с файлами в Python, вы сталкиваетесь с ситуациями, когда вам нужно вывести список файлов в каталоге. Например, вам может понадобиться найти все файлы Python в папке.
Библиотека Python OS предлагает ряд методов, которые можно использовать для получения списка файлов в каталоге. В этом руководстве мы обсудим, как использовать os.listdir() для получения файлов и папок в директории. Мы также поговорим об использовании os.walk() для получения файлов и папок в каталоге и в его подкаталогах.
Библиотека ОС Python
Библиотека Python OS предоставляет ряд функций, которые можно использовать для работы с операционными системами. Функции, включенные в модуль os, работают в любой современной операционной системе, будь то Windows, Linux или Mac.
Поскольку os — это внешняя библиотека, нам нужно импортировать ее в наш код, прежде чем мы начнем ее использовать. Мы можем сделать это с помощью оператора импорта Python:
Теперь, когда мы импортировали библиотеку os в наш код, мы можем начать использовать ее функции для отображения элементов в каталоге.
Python os.listdir()
В Python метод os.listdir() выводит список файлов и папок в заданном каталоге. Метод не возвращает специальные записи, такие как «.» и «..», которые операционная система использует для навигации по различным каталогам.
os.listdir() также не возвращает файлы и папки за пределами первого уровня папок. Другими словами, os.listdir() ничего не возвращает в подпапках, обнаруженных методом.
81 % участников заявили, что стали более уверенными в своих перспективах работы в сфере технологий после посещения учебного курса. Примите участие в тренировочном лагере сегодня.
Найдите подходящий вариант для буткемпа
В среднем выпускник буткемпа тратит менее шести месяцев на смену карьеры, начиная с буткемпа и заканчивая поиском своей первой работы.
Начните сменить профессию сегодня
Функция os.listdir() принимает один параметр: путь к каталогу, имена файлов и папок которого вы хотите получить.
Вот синтаксис метода listdir:
Давайте рассмотрим пример, чтобы продемонстрировать, как использовать этот метод в программе Python.
Пример os.listdir() на Python
Скажем, мы создаем программу, которая анализирует показатели Netflix на фондовом рынке за последнее десятилетие. У нас есть папка (название: /home/data_analysis/netflix) со всеми нашими необработанными данными, и перед запуском нашей программы мы хотим убедиться, что файл raw_data_2019.csv существует в ней. эту папку.
Для правильной работы нашей программе необходимо, чтобы этот конкретный файл хранился в этой конкретной папке.
Мы можем использовать следующий код для получения списка файлов в рабочем каталоге /home/data_analysis/netflix:
Наша программа извлекает список всех файлов и папок в указанном каталоге и возвращает следующее:
- Care Karma подберет для вас лучшие учебные курсы по технологиям
- Получайте эксклюзивные стипендии и подготовительные курсы
Теперь мы можем проверить, находится ли файл raw_data_2019.csv в папке. Как видите, это так.
Давайте разберем наш код. В первой строке мы импортируем модуль os, что нам нужно сделать, чтобы получить доступ к функции os.listdir(). Затем мы объявляем переменную Python с именем path, в которой хранится имя пути, содержимое которого мы хотим получить.
В следующей строке мы используем метод os.listdir() для получения списка файлов и папок в каталоге /home/data_analysis/netflix. Наконец, мы создаем цикл Python for. Этот цикл перебирает каждый элемент в списке, созданном os.listdir(). Мы выводим имя каждого файла на консоль с помощью оператора Python print().
Каталог /home/data_analysis/netflix содержал шесть файлов и один каталог. Каталог называется processed_data и отличается от других файлов тем, что не имеет расширения.
Python os.walk()
Функция os.walk() извлекает список файлов, содержащихся в дереве. Метод выполняет итерацию по каждому каталогу в дереве. Затем os.walk() возвращает имя каждого файла и папки в каталоге и любом из его подкаталогов.
Синтаксис метода os.walk() следующий:
Метод os.walk() принимает четыре параметра:
- top – это каталог верхнего уровня, имена файлов и папок компонентов которого вы хотите получить (обязательно)
- topdown, если установлено значение True, указывает, что каталоги должны сканироваться сверху вниз. Если для этого параметра задано значение False, каталоги будут сканироваться снизу вверх (необязательно)
- onerror предоставляет обработчик ошибок при обнаружении ошибки (необязательно)
- followlinks, если установлено значение True, посещает папки, на которые ссылаются системные ссылки (необязательно)
Мы сосредоточимся на первых двух параметрах, так как onerror и followlinks являются более сложными и используются не так часто.
Пример os.walk() на Python
Допустим, мы хотим получить имена всех файлов в каталоге /home/data_analysis/netflix. Мы также хотим узнать, что содержится во всех подкаталогах этой папки.
Как уже говорилось выше, каталог netflix содержит одну папку: processed_data. Мы могли бы использовать следующий код для получения имен всех файлов в каталоге /home/data_analysis/netflix и его подкаталогах:
Вот результат нашего кода:
"Карма карьеры вошла в мою жизнь, когда я больше всего в ней нуждалась, и быстро помогла мне пройти буткемп. Через два месяца после выпуска я нашла работу своей мечты, которая соответствовала моим ценностям и целям в жизни!"
Венера, инженер-программист в Rockbot
Найдите подходящий вариант для буткемпа
Мы импортируем модуль os, из которого мы ссылаемся на методы os.walk() и os.path.join() позже в нашем коде. Затем мы объявляем переменную с именем path, в которой хранится путь, имена файлов которого мы хотим обнаружить.
Затем мы создаем цикл for, который использует os.walk() для получения списка всех файлов и папок в каталоге path. . Этот цикл перебирает файлы и папки, которые возвращает os.walk(). Стоит отметить, что мы указываем параметр topdown=False в методе os.walk(), который указывает нашему коду выполнять поиск сверху вниз.
Наш цикл for перебирает каждый файл и каталог, обнаруженные операционной системой.walk(), используя дополнительные циклы for. Мы выводим файлы из os.walk() на консоль.
В приведенном выше коде представлены циклы for:
Затем наша программа использует os.path.join() для объединения корневой папки каждого файла (т. е. /home/data_analysis/netflix) и имени файла (т. е. raw_datra_2019.csv). Корневая папка — это путь к каталогу, в котором находится файл.
Заключение
Для этого можно использовать метод Python listdir(). Вы также можете использовать метод walk(), который выводит список всего в каталоге, включая все, что находится в подкаталогах.
В этом руководстве с примерами показано, как использовать методы os.listdir() и os.walk() для вывода списка файлов и папок в каталоге в Python. . Теперь у вас есть навыки, необходимые для составления списка файлов в каталоге на Python, как у эксперта!
Чтобы узнать больше о программировании на Python, прочтите наше полное руководство How to Learn Python.
Ответы на этот вопрос созданы сообществом. Отредактируйте существующие ответы, чтобы улучшить этот пост. В настоящее время он не принимает новые ответы или взаимодействия.
Как я могу перечислить все файлы каталога в Python и добавить их в список?
21 Ответ 21
os.listdir() предоставит вам все, что находится в каталоге — файлы и каталоги.
Если вам нужны просто файлы, вы можете отфильтровать их с помощью os.path :
или вы можете использовать os.walk(), который выдаст два списка для каждого каталога, который он посещает, с разделением на файлы и каталоги для вас. Если вам нужен только верхний каталог, вы можете сломать его при первом выходе
Немного проще: (_, _, имена файлов) = walk(mypath).next() (если вы уверены, что обход вернет хотя бы одно значение, что и должно быть.)
Незначительное изменение для хранения полных путей: for (dirpath, dirnames, filenames) in os.walk(mypath): checksum_files.extend(os.path.join(dirpath, filename) for filename in filenames) break
f.extend(filenames) на самом деле не эквивалентно f = f + filenames . extend изменит f на месте, а добавление создаст новый список в новом месте памяти. Это означает, что extend обычно более эффективен, чем + , но иногда это может привести к путанице, если несколько объектов содержат ссылки на список. Наконец, стоит отметить, что f += filenames эквивалентно f.extend(filenames) , не f = f + filenames .
@misterbee, ваше решение лучшее, всего одно маленькое улучшение: _, _, filenames = next(walk(mypath), (None, None, []))
Я предпочитаю использовать модуль glob, так как он выполняет сопоставление с образцом и расширение.
Сопоставление с образцом выполняется интуитивно
Он вернет список с запрошенными файлами и каталогами:
Обратите внимание, что glob игнорирует файлы и каталоги, имена которых начинаются с точки . , так как они считаются скрытыми файлами и каталогами, если шаблон не похож на .* .
Используйте glob.escape для экранирования строк, которые не являются шаблонами:
Есть ли способ гарантировать, что элементы, возвращаемые из glob, являются только файлами? Я спрашиваю о случае, когда файлы могут существовать без расширений (или других сценариях, когда файлы и папки неотличимы только по их строкам пути). Я отмечаю, что это уместное разъяснение, поскольку ОП не указал, имеют ли их файлы расширения.
список в текущем каталоге
С listdir в модуле os вы получаете файлы и папки в текущем каталоге
Поиск в каталоге
с помощью glob вы можете указать тип файла для отображения следующим образом
получить полный путь только к файлам в текущем каталоге
Получение полного пути с помощью os.path.abspath
Взамен вы получите полный путь
Обход: просмотр подкаталогов
os.walk возвращает корень, список каталогов и список файлов, поэтому я распаковал их в r, d, f в цикле for; затем он ищет другие файлы и каталоги в подпапках корня и так далее, пока не останется подпапок.
Для перехода вверх по дереву каталогов
Получить файлы определенного подкаталога с помощью os.listdir()
os.walk('.') - текущий каталог
следующий(os.walk('.')) и os.path.join('каталог', 'файл')
os.listdir() — получить только текстовые файлы
Использование glob для получения полного пути к файлам
Использование os.path.isfile для обхода каталогов в списке
Использование pathlib из Python 3.4
С пониманием списка:
Использовать метод glob в pathlib.Path()
Получить все и только файлы с помощью os.walk: проверяет только третий возвращаемый элемент, то есть список файлов
Получить только файлы со следующим в каталоге: возвращает только файл в корневой папке
Получить только каталоги с помощью next и перейти в каталог, потому что в элементе [1] есть только папки
Получить все имена подкаталогов с помощью walk
os.scandir() из Python 3.5 и выше
Это мешанина из слишком большого количества ответов на вопросы, которые здесь не заданы. Возможно, также стоит объяснить, какие существуют предостережения или рекомендуемые подходы. Я не лучше знаю один способ, а не 20 способов сделать одно и то же, если я также не знаю, какой из них лучше использовать, когда.
Хорошо, как можно скорее я посмотрю на свой ответ и постараюсь сделать его более понятным и с более полезной информацией о различиях между методами и т. д.
Не следует определять расширение файла, проверяя, содержит ли имя файла подстроку. Это может вызвать много неприятностей. Я рекомендую всегда проверять, заканчивается ли имя файла определенной подстрокой.
Такие подборки могут быть полезны, но этот ответ, в частности, не добавляет ценности существующим ответам. Просто для примера: [f вместо f в glob.glob("*.txt")] эквивалентно glob.glob("*.txt") и не требует дополнительного раздела в этой записи. Это также очень многословно и с большим количеством пробелов. Улучшение может быть достигнуто путем добавления объяснений или указания различий вместо перечисления еще одного варианта.
Спасибо за комментарий, вы, конечно, правы, и я буду следовать вашим советам как можно скорее, чтобы сделать его более полезным, возможно, за эти годы я мог бы сделать несколько лучших ответов. Просто дайте мне несколько дней, чтобы переработать его.
вернет список всех файлов и каталогов в "somedirectory".
@JIXiang: os.listdir() всегда возвращает просто имена файлов (а не относительные пути). То, что возвращает функция glob.glob(), определяется форматом пути входного шаблона.
Однострочное решение для получения только списка файлов (без подкаталогов):
или абсолютные пути:
проблема с glob заключается в том, что папка с именем 'something.something' будет возвращена glob('/home/adam/*.*')
В OS X есть нечто, называемое пакетом. Это каталог, который обычно следует рассматривать как файл (например, .tar). Вы хотите, чтобы они рассматривались как файл или каталог? Использование glob() будет рассматривать его как файл. Ваш метод будет рассматривать его как каталог.
Получение полных путей к файлам из каталога и всех его подкаталогов
-
Путь, который я указал в приведенной выше функции, содержал 3 файла — два из них в корневом каталоге и еще один в подпапке с именем «SUBFOLDER». Теперь вы можете делать такие вещи, как:
print full_file_paths, который распечатает список:
- ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat' ]
При желании вы можете открыть и прочитать содержимое или сосредоточиться только на файлах с расширением ".dat", как в приведенном ниже коде:
Начиная с версии 3.4 для этого есть встроенные итераторы, которые намного эффективнее, чем os.listdir() :
Согласно PEP 428, цель библиотеки pathlib — предоставить простую иерархию классов для обработки путей файловой системы и обычных операций, которые пользователи выполняют над ними.
Обратите внимание, что os.walk() использует os.scandir() вместо os.listdir() из версии 3.5, и его скорость увеличилась в 2-20 раз в соответствии с PEP 471.
Позвольте мне также порекомендовать прочитать комментарий ShadowRanger ниже.
Спасибо! Я думаю, что это единственное решение, не возвращающее непосредственно список. При желании можно использовать p.name вместо первого p.
Добро пожаловать! Я бы предпочел генерировать экземпляры pathlib.Path(), поскольку у них есть много полезных методов, которые я не хотел бы тратить впустую. Вы также можете вызвать для них str(p) для получения имён путей.
Примечание. Решение os.scandir будет более эффективным, чем os.listdir с проверкой os.path.is_file и т.п., даже если вам нужен список (так что отложенная итерация вам не поможет). поскольку os.scandir использует предоставляемые ОС API, которые предоставляют вам информацию is_file бесплатно по мере ее повторения, нет никакого кругового обращения к диску для каждого файла, чтобы вообще получить их статистику (в Windows DirEntry предоставляет вам полную статистику бесплатно, на *В системах NIX требуется статистика для информации помимо is_file , is_dir и т. д., но DirEntry кэширует первую статистику для удобства).
Вы также можете использовать entry.name, чтобы получить только имя файла, или entry.path, чтобы получить полный путь к нему. Больше никаких os.path.join() повсюду.
Предварительные примечания
- Хотя в тексте вопроса есть четкое различие между терминами файл и каталог, некоторые могут утверждать, что каталоги на самом деле являются особыми файлами
- Утверждение: "все файлы каталога" можно интерпретировать двумя способами:
- Только все прямые (или 1-го уровня) потомки
- Все потомки во всем дереве каталогов (включая подкаталоги)
Когда был задан вопрос, я предположил, что Python 2 был версией LTS, однако примеры кода будут выполняться Python 3 (.5 ) (я буду поддерживать их как можно более совместимыми с Python 2; кроме того, любой код, принадлежащий Python, который я собираюсь опубликовать, относится к версии 3 .5.4 - если не указано иное).Это имеет последствия, связанные с другим ключевым словом в вопросе: "добавить их в список":
- В версиях, предшествующих Python 2.2, последовательности (итерации) в основном представлялись списками (кортежами, наборами и т. д.)
- В Python 2.2 была введена концепция генератора ([Python.Wiki]: Generators) — любезно предоставленная [Python 3]: оператор yield). Со временем стали появляться аналоги-генераторы для функций, которые возвращали/работали со списками
- В Python 3 генератор используется по умолчанию.
- Не уверен, что возврат списка по-прежнему является обязательным (или генератор тоже подойдет), но передача генератора в конструктор list создаст из него список (а также использует его ). Пример ниже иллюстрирует различия в [Python 3]: map(function, iterable, . )
Примеры будут основаны на каталоге с именем root_dir со следующей структурой (этот пример для Win, но я использую то же дерево на Lnx тоже):
Решения
Программные подходы:
Возвращает список, содержащий имена записей в каталоге, указанном путем. Список находится в произвольном порядке и не включает специальные записи '.' и '..' .
Более сложный пример (code_os_listdir.py):
Примечания:
- Есть две реализации:
- Тот, который использует генераторы (конечно здесь он кажется бесполезным, так как я сразу конвертирую результат в список)
- Классический (названия функций заканчиваются на _old)
- Тот, который начинается с символа подчеркивания (_): "частный" (не следует вызывать напрямую) – он выполняет всю работу
- Общедоступный (обертка поверх предыдущего): он просто удаляет начальный путь (если требуется) из возвращаемых записей. Это уродливая реализация, но это единственная идея, которая пришла мне в голову на данный момент
Вывод:
Возвращает итератор объектов os.DirEntry, соответствующих записям в каталоге, указанном в path. Записи выводятся в произвольном порядке, а специальные записи '.' и '..' не включены.
Использование scandir() вместо listdir() может значительно повысить производительность кода, которому также требуется информация о типе файла или атрибуте файла, поскольку объекты os.DirEntry предоставляют эту информацию. если операционная система предоставляет его при сканировании каталога. Все методы os.DirEntry могут выполнять системный вызов, но is_dir() и is_file() обычно требуют системного вызова только для символических ссылок; os.DirEntry.stat() всегда требует системного вызова в Unix, но требует его только для символических ссылок в Windows.
Примечания:
- Это похоже на os.listdir
- Но он также более гибкий (и предлагает больше функций), более Pythonic (а в некоторых случаях быстрее)
Создайте имена файлов в дереве каталогов, обходя дерево сверху вниз или снизу вверх. Для каждого каталога в дереве, корнем которого является каталог top (включая сам top), он дает 3-кортеж ( dirpath , dirnames , filenames ).
цитата>Примечания:
- Под сценами используется os.scandir ( os.listdir в более старых версиях)
- Он выполняет тяжелую работу, повторяясь во вложенных папках.
Возвращает возможно пустой список имен путей, соответствующих pathname, который должен быть строкой, содержащей спецификацию пути. путь может быть абсолютным (например, /usr/src/Python-1.5/Makefile ) или относительным (например, ../../Tools/*/*.jpg ) и может содержать стиль оболочки подстановочные знаки. Неработающие симлинки включаются в результаты (как и в оболочке).
.
Изменено в версии 3.5: поддержка рекурсивных подстановок с использованием «**».Примечания:
- Использует os.listdir
- Для больших деревьев (особенно если включена функция recursive) предпочтительнее iglob
- Разрешает расширенную фильтрацию на основе имени (из-за подстановочного знака)
Примечания:
- Это один способ достижения нашей цели
- Это стиль ООП для обработки путей
- Предлагает множество функций
- Но согласно [GitHub]: python/cpython - (2.7) cpython/Lib/dircache.py, это просто (тонкая) оболочка над os.listdir с кэшированием
ctypes — это внешняя библиотека функций для Python. Он предоставляет типы данных, совместимые с C, и позволяет вызывать функции в библиотеках DLL или разделяемых библиотеках. Его можно использовать для переноса этих библиотек в чистый Python.
Примечания:
Вывод:
Получает список совпадающих имен файлов, используя Windows Unicode API. Интерфейс к функциям API FindFirstFileW/FindNextFileW/Find close.
Примечания:
- win32file.FindFilesW является частью [GitHub]: mhammond/pywin32 — расширения Python для Windows (pywin32), которые представляют собой Python обертку над WINAPIs
- Ссылка на документацию взята из ActiveState, так как я не нашел никакой официальной документации по PyWin32
- Установите какой-нибудь (другой) сторонний пакет, который помогает
- Скорее всего, будет использоваться один (или несколько) из вышеперечисленных (возможно, с небольшими изменениями)
Примечания:
Код должен быть переносимым (за исключением мест, предназначенных для определенной области, которые помечены) или перекрестным:
- платформа (Nix, Win, )
- Python версия (2, 3, )
В приведенных выше вариантах использовалось несколько стилей пути (абсолютный, относительный), чтобы проиллюстрировать тот факт, что используемые «инструменты» гибки в этом направлении
- Может быть выполнена некоторая расширенная фильтрация (вместо просто файла по сравнению с каталогом): например. аргумент include_folders можно заменить другим (например, filter_func), который будет функцией, принимающей путь в качестве аргумента: filter_func=lambda x: True (это не ничего не обрезать), а внутри _get_dir_content что-то вроде: if not filter_func(entry_with_path): continue (если функция не работает для одной записи, она будет пропущена), но чем сложнее становится код, тем выполнение займет больше времени
Примечание! Поскольку используется рекурсия, я должен упомянуть, что я провел несколько тестов на своем ноутбуке (Win 10 x64), совершенно не связанных с этой проблемой, и когда уровень рекурсии достиг значения где-то в ( 990 .. 1000) диапазон (recursionlimit - 1000 (по умолчанию)), я получил StackOverflow :). Если дерево каталогов превышает этот предел (я не эксперт по FS, поэтому не знаю, возможно ли это вообще), это может стать проблемой.
Я также должен упомянуть, что я не пытался увеличить recursionlimit, потому что у меня нет опыта в этой области (насколько я могу увеличить его, прежде чем также увеличить стек в уровень ОС), но теоретически всегда будет возможность сбоя, если глубина каталога больше максимально возможного recursionlimit (на этой машине)Примеры кода предназначены только для демонстрационных целей. Это означает, что я не принял во внимание обработку ошибок (я не думаю, что есть какие-либо try / except / else / finally), поэтому код не является надежным (причина в том, чтобы сделать его как можно более простым и коротким). Для производства также необходимо добавить обработку ошибок
Другие подходы:
Используйте Python только как оболочку
- Все делается по другой технологии
- Эта технология вызывается из Python
Самый известный из известных мне вариантов — это то, что я называю подходом системного администратора:
- Используйте Python (или любой другой язык программирования) для выполнения команд shell (и анализа их выходных данных)
- Некоторые считают это хитрым приемом
- Я считаю это скорее неудачным обходным решением (gainarie), так как действие само по себе выполняется из shell (в данном случае cmd ) и поэтому не имеет ничего общего с Python.
- Фильтрация ( grep / findstr ) или форматирование вывода могут выполняться с обеих сторон, но я не собираюсь на этом настаивать. Кроме того, я намеренно использовал os.system вместо subprocess.Popen .
В целом этого подхода следует избегать, поскольку, если формат вывода какой-либо команды немного отличается в разных версиях/разновидностях ОС, код синтаксического анализа также следует адаптировать; не говоря уже о различиях между локалями).
Список файлов в каталоге полезен для проверки файлов, доступных в каталоге.
Вы можете перечислить файлы в каталоге в python, используя метод os.listdir().
В этом руководстве вы узнаете, как составить список файлов в каталоге в Python, используя различные библиотеки.
Если вы спешите…
Вы можете использовать приведенный ниже фрагмент кода для отображения списка файлов в каталоге.
os.listdir() выводит список всех файлов и папок в каталоге. Если путь не указан, то в нем перечислены файлы из текущего рабочего каталога.
Используйте только прямую косую черту в пути к каталогу.
Вывод
Выделенный объект — это папка в каталоге.
Отображение только файлов в каталоге
Чтобы отобразить только файлы в каталоге, вы можете использовать метод os.walk().
Он вернет два отдельных списка файлов и папок. Вы можете просмотреть список файлов и получить доступ к файлам в каталоге.
Фрагмент
Вывод
Если вы хотите понять подробности, читайте дальше…
В этом руководстве вы познакомитесь с различными методами, доступными для отображения списка файлов в каталоге.
Оглавление
Список файлов в каталоге
Существует пять методов для отображения файлов в каталоге. Вы узнаете, как использовать эти методы, а также узнаете, как использовать эти методы для различных случаев использования.
Использование listdir()
listdir выбирает все файлы и папки в каталоге.
В нем перечислены все файлы и папки в текущем каталоге.
Фрагмент
Вывод
Если вы хотите получить список файлов из пользовательского каталога, вы можете передать имя каталога методу listdir(), как показано ниже.
Фрагмент
Вывод
Вот как вы можете использовать метод listdir().
Использование os.walk()
Метод os.walk() можно использовать для вывода списка файлов и папок в каталоге.
Этот метод просматривает каталог сверху вниз или снизу вверх и возвращает список записей.
Чтобы пройтись сверху вниз, вы можете передать параметр topdown=True .
Подробнее см. в документе.
Фрагмент
Вы можете увидеть вывод ниже. Записи в справочнике печатаются в порядке сверху вниз.
Вывод
Вот как вы можете использовать метод os.walk().
Использование os.scandir()
Вы можете использовать метод os.scandir() для вывода списка записей в каталоге.
os.scandir() возвращает итератор объектов каталога. Затем его можно повторить и распечатать следующим образом. Дополнительные сведения см. в документе.
В этом примере сначала вы создадите итератор записей, доступных в каталоге, и используете цикл for для итерации записей. И каждое имя записи может быть напечатано с использованием атрибута entry.name.
Фрагмент
Вы увидите все доступные записи в каталоге, как показано ниже.
Вывод
Вот как вы можете сканировать каталог и повторять записи, чтобы напечатать его имена.
Использование Pathlib
Вы можете использовать библиотеку PathLib для получения списка всех файлов из каталога. Дополнительные сведения см. в документе pathlib.
Сначала создайте объект, используя каталог, из которого вы хотите получить список файлов.
Затем с помощью объекта выполните итерацию каталога с помощью метода iterdir() и распечатайте каждую запись файла.
При этом будут напечатаны все файлы и только подкаталоги, доступные в основном каталоге.
Он не будет печатать файлы, доступные в подкаталогах.
Фрагмент
Вы увидите имена файлов и имена подкаталогов.
Вывод
Вот как вы можете использовать Pathlib для вывода списка файлов в каталоге.
Использование глоба
Вы можете использовать glob API для получения списка файлов с помощью сопоставления с образцом или регулярных выражений. Это очень полезно, когда вы не знаете точных имен файлов или каталогов, но хотите проверить, существует ли файл с таким шаблоном.
Вы также можете проверить файлы в подкаталогах, используя рекурсивный флаг .
- Если выбрано значение True , будут включены подкаталоги.
- Если задано значение False , подкаталоги будут игнорироваться.
Фрагмент
Вывод
Это методы, которые вы можете использовать для получения всех файлов в каталоге.
Далее давайте обсудим варианты использования.
Список файлов в каталоге с расширением
В этом разделе вы узнаете, как составить список файлов в каталоге с определенным расширением.
Вы создадите итератор с помощью метода os.listdir() и проверите расширение каждой записи с помощью метода endwith().
Если расширение соответствует желаемому расширению, вы можете распечатать файлы.
В противном случае вы можете игнорировать его.
В приведенном ниже примере вы распечатаете только HTML-файлы, доступные в текущем каталоге.
Фрагмент
В каталоге есть два HTML-файла. Он будет напечатан.
Вывод
Вот как вы можете перечислить файлы с определенным расширением.
Список файлов в каталоге и подкаталогах
В этом разделе вы узнаете, как составить список всех файлов в каталогах и подкаталогах.
Это можно сделать с помощью метода os.walk(). Он просматривает все записи в каталоге.
Если какой-либо подкаталог найден, он также просматривает записи, доступные в подкаталоге.
Наконец, он дает отдельные кортежи, которые содержат пути к каталогам, подкаталогам и файлам.
Вы можете выполнить итерацию по кортежу files, чтобы получить доступ к записям файлов в каталоге.
Фрагмент
Вы увидите все файлы, напечатанные в основном каталоге и подкаталоге.
Вывод
Вот как вы можете распечатать файлы в каталоге и подкаталогах.
Полный путь к файлам в каталоге
В этом разделе вы узнаете, как составлять список файлов в каталоге с полными путями. Как и в предыдущем разделе, вы пройдете по каталогу с помощью метода os.walk() и получите отдельные кортежи с информацией о пути, подкаталоге и файлах.
Чтобы получить список файлов с полным путем, вы можете использовать метод os.path.join(), чтобы соединить путь и имя файла, как показано ниже.
Фрагмент
Вы увидите следующий вывод. Имена файлов будут напечатаны с полной информацией о пути.
Вывод
Вот как вы можете перечислить файлы с полной информацией о пути.
Список файлов в каталоге с сопоставлением с образцом
В этом разделе вы узнаете, как составлять список файлов в каталоге с сопоставлением с образцом.
Это будет полезно, если вы не знаете точного имени файла, но хотите найти файлы по определенному шаблону.
Вы можете использовать регулярное выражение для отображения списка файлов в каталоге.
Например, давайте узнаем, как составить список файлов, начинающихся с имени sample, с помощью библиотеки glob.
Начиная с
Регулярное выражение для поиска файлов, начинающихся с текста sample, — sample*. Это означает, что имя файла должно начинаться с образца текста и далее может содержать любой набор символов.
Используйте фрагмент кода ниже, чтобы перечислить файлы, начинающиеся с sample
.Фрагмент
Есть пять файлов, начинающихся с текста sample. Все эти файлы будут распечатаны.
Вывод
Вы можете использовать любой шаблон регулярного выражения вместе с glob для идентификации файлов с определенным шаблоном.
Список файлов в каталоге, отсортированных по имени
В этом разделе вы узнаете, как составлять список всех файлов в каталоге и отображать их в отсортированном виде.
Сначала вы перечислите все записи в указанном каталоге, используя os.listdir() .
Используя это, вы перечислите файлы в каталоге. Файлы в подкаталогах будут игнорироваться.
Далее, используя понимание списка,
- Повторить записи, используя файл для файла в os.listdir(dir_path)
- Проверьте, является ли запись файлом, используя if os.path.isfile(os.path.join(dir_path, file) . Если да, верните запись в понимание списка. Вы получите список файлов.
- Отсортируйте список файлов с помощью метода sorted().
Используйте приведенный ниже фрагмент, чтобы отсортировать файлы.
Фрагмент
Вы увидите имена файлов в алфавитном порядке.
Вывод
Вы отобразили файлы в каталоге, отсортированные по имени.
Список файлов в каталоге и подкаталогах, отсортированных по имени
В этом разделе вы узнаете, как составить список файлов в каталоге и подкаталогах, отсортированных по имени.
Чтобы отобразить файлы в каталоге и его подкаталоге, используйте
- glob.glob(dir_path + '/**/*', recursive=True), чтобы вернуть все записи, доступные в каталоге.
- фильтруйте только записи о типах файлов, используя метод filter() и условие os.path.isfile . При этом имена подкаталогов будут игнорироваться в списке. Но файлы в подкаталогах будут добавлены в список.
- Отсортируйте список имен файлов с помощью метода sorted().
Фрагмент
Вы увидите результат, показанный ниже. Сначала будут отображаться файлы в каталоге, а затем файлы в основном каталоге будут отображаться в отсортированном виде.
Вывод
Вот как вы можете перечислить файлы, отсортированные по имени.
Список файлов в каталоге, отсортированных по времени
В этом разделе вы узнаете, как отсортировать файлы в каталоге по имени last_modified. Это может быть полезно в случаях, когда вы хотите получить последний файл.
Чтобы отобразить файлы только в основном каталоге, используйте
- glob.glob(dir_path+'/*'), чтобы вернуть все записи, доступные в основном каталоге.
- отфильтровать только записи о типах файлов, используя метод filter() и условие os.path.isfile .
- Отсортируйте список имен файлов с помощью метода sorted(). Во время сортировки вы можете передать ключ как key=os.path.getmtime . Список будет отсортирован по времени последнего изменения.
Фрагмент
Вы увидите файлы, перечисленные в порядке времени последнего изменения.
Вывод
Вот как вы можете перечислить файлы только из основного каталога, отсортированные по дате последнего изменения.
Список файлов в каталоге и подкаталогах, отсортированных по времени
В этом разделе вы узнаете, как составить список файлов в каталоге и его подкаталогах, отсортированных по его имени last_modified.
Чтобы отобразить файлы только в основном каталоге и его подкаталогах, используйте
- glob.glob(dir_path + '/**/*', recursive=True), чтобы вернуть все записи, доступные в основном каталоге и его подкаталогах.
- отфильтровать только записи о типах файлов, используя метод filter() и условие os.path.isfile .
- Отсортируйте список имен файлов с помощью метода sorted(). Во время сортировки вы можете передать ключ как key=os.path.getmtime . Список будет отсортирован по времени последнего изменения.
Фрагмент
Вы увидите список файлов из основного каталога и подкаталога на основе даты последнего изменения.
Вывод
Вот как вы можете составить список файлов по дате их последнего изменения.
Список файлов в каталоге, отсортированных по размеру
В этом разделе вы узнаете, как составить список файлов в каталоге, отсортированных по размеру файла.
Чтобы отобразить файлы только в основном каталоге, используйте
- glob.glob(dir_path+'/*'), чтобы вернуть все записи, доступные в основном каталоге.
- Фильтровать только записи типа файла, используя метод filter() и условие os.path.isfile .
- Отсортируйте список имен файлов с помощью метода sorted(). Во время сортировки вы можете передать ключ как key=os.path.getsize . Список будет отсортирован по размеру файлов.
Фрагмент
Вы увидите список файлов в зависимости от их размера.
Вывод
Вот как вы можете перечислить все файлы из основного каталога, отсортированные по размеру файла.
Список файлов в каталоге и подкаталогах, отсортированных по размеру
В этом разделе вы узнаете, как составить список файлов в каталоге и его подкаталогах, отсортированных по размеру файла
Чтобы отобразить файлы только в основном каталоге и его подкаталогах, используйте
- glob.glob(dir_path + '/**/*', recursive=True), чтобы вернуть все записи, доступные в основном каталоге и его подкаталогах.
- отфильтровать только записи о типах файлов, используя метод filter() и условие os.path.isfile .
- Отсортируйте список имен файлов с помощью метода sorted(). Во время сортировки вы можете передать ключ как key=os.path.getsize . Список будет отсортирован по размеру файла.
Фрагмент
Вы увидите файлы из основного каталога и подкаталога, отсортированные по размеру файла.
Вывод
Вот как вы можете перечислить файлы из основного каталога и подкаталога, отсортированные по размеру файла.
Список файлов в сетевом каталоге
В этом разделе вы перечислите файлы из сетевого каталога.
Это можно сделать с помощью метода listdir().
- У вас есть доступ для чтения к сетевому каталогу
- Используйте полное имя сетевого сервера.
Фрагмент
Вот как вы можете просмотреть список файлов в сетевом каталоге.
Заключение
Подводя итог, вы узнали о различных методах, доступных в python для отображения файлов в каталоге. Вы также узнали, как эти методы можно использовать в различных сценариях для отображения имен файлов, доступных в каталоге.
Если вы хотите получить список файлов из каталогов из системной оболочки, прочитайте Как выполнить команду оболочки из учебника Python.
Я предпочитаю работать с Python, потому что это очень гибкий язык программирования, который позволяет мне легко взаимодействовать с операционной системой. Это также включает в себя функции файловой системы. Чтобы просто перечислить файлы в каталоге, в игру вступают модули os, subprocess, fnmatch и pathlib. Следующие решения демонстрируют, как эффективно использовать эти методы.
Использование os.walk()
Модуль os содержит длинный список методов, которые работают с файловой системой и операционной системой. Одним из них является walk() , который генерирует имена файлов в дереве каталогов, проходя по дереву либо сверху вниз, либо снизу вверх (по умолчанию сверху вниз).
os.walk() возвращает список из трех элементов. Он содержит имя корневого каталога, список имен подкаталогов и список имен файлов в текущем каталоге. В листинге 1 показано, как написать это, используя всего три строки кода. Это работает с интерпретаторами Python 2 и 3.
Листинг 1. Обход текущего каталога с помощью os.walk()
Использование командной строки через подпроцесс
Примечание. Несмотря на то, что это допустимый способ перечисления файлов в каталоге, его не рекомендуется использовать, поскольку он создает возможность для атак путем внедрения команд.
Как уже было описано в статье Параллельная обработка в Python, модуль подпроцесса позволяет выполнять системную команду и собирать ее результат. Системная команда, которую мы вызываем в этом случае, следующая:
Пример 1. Список файлов в текущем каталоге
Команда ls -p . выводит список файлов каталога для текущего каталога и добавляет разделитель / в конце имени каждого подкаталога, который нам понадобится на следующем шаге. Вывод этого вызова передается команде grep, которая фильтрует данные по мере необходимости.
Параметры -v /$ исключают все имена записей, которые заканчиваются разделителем / . На самом деле /$ — это регулярное выражение, которое соответствует всем строкам, содержащим символ / в качестве самого последнего символа перед концом строки, который представлен $ .
Модуль подпроцесса позволяет создавать настоящие каналы и соединять входные и выходные потоки так же, как вы делаете это в командной строке. Вызов метода subprocess.Popen() открывает соответствующий процесс и определяет два параметра с именами stdin и stdout.
В листинге 2 показано, как это запрограммировать. Первая переменная ls определяется как процесс, выполняющий ls -p. который выводит в трубу. Вот почему канал stdout определен как subprocess.PIPE . Вторая переменная grep также определена как процесс, но вместо этого выполняет команду grep -v /$ .
Для чтения вывода команды ls из канала канал стандартного ввода grep определяется как ls.stdout . Наконец, переменная endOfPipe считывает вывод grep из grep.stdout, который выводится в stdout поэлементно в цикле for ниже. Результат показан в Примере 2.
Листинг 2. Определение двух процессов, связанных каналом
Пример 2. Запуск программы
Это решение хорошо работает как с Python 2, так и с Python 3, но можно ли его как-то улучшить? Тогда давайте посмотрим на другие варианты.
Сочетание os и fnmatch
Как вы уже видели, решение с использованием подпроцессов элегантно, но требует большого количества кода. Вместо этого давайте объединим методы из двух модулей os и fnmatch. Этот вариант также работает с Python 2 и 3.
В качестве первого шага мы импортируем два модуля os и fnmatch. Затем мы определяем каталог, в который мы хотели бы вывести список файлов, используя os.listdir() , а также шаблон для фильтрации файлов. В цикле for мы перебираем список записей, хранящихся в переменной listOfFiles .
Наконец, с помощью fnmatch мы фильтруем записи, которые ищем, и выводим соответствующие записи на стандартный вывод. Листинг 3 содержит скрипт Python, а Пример 3 — соответствующие выходные данные.
Листинг 3. Список файлов с использованием модуля os и fnmatch
Пример 3. Вывод листинга 3
Бесплатная электронная книга: Git Essentials
Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!
Использование os.listdir() и генераторов
Проще говоря, генератор — это мощный итератор, сохраняющий свое состояние. Чтобы узнать больше о генераторах, ознакомьтесь с одной из наших предыдущих статей — Генераторы Python.
Следующий вариант объединяет метод listdir() модуля os с функцией-генератором. Код работает с версиями 2 и 3 Python.
Как вы уже могли заметить, метод listdir() возвращает список записей для данного каталога. Метод os.path.isfile() возвращает True, если данная запись является файлом. Оператор yield завершает работу функции, но сохраняет текущее состояние и возвращает только имя записи, обнаруженной как файл. Это позволяет нам перебирать функцию-генератор (см. листинг 4). Результат идентичен результату из примера 3.
Листинг 4. Объединение os.listdir() и функции-генератора
Использовать библиотеку путей
Модуль pathlib описывает себя как способ «разбирать, создавать, тестировать и иным образом работать с именами файлов и путями, используя объектно-ориентированный API вместо низкоуровневых строковых операций». Звучит круто - давайте сделаем это. Начиная с Python 3 модуль входит в стандартный дистрибутив.
В листинге 5 мы сначала определяем каталог. Точка ("".") определяет текущий каталог. Затем метод iterdir() возвращает итератор, который выдает имена всех файлов. В цикле for мы печатаем имена файлов один за другим.
Листинг 5. Чтение содержимого каталога с помощью pathlib
Опять же, выходные данные идентичны выходным данным из примера 3.
В качестве альтернативы мы можем извлекать файлы, сопоставляя их имена с помощью чего-то, что называется glob. Таким образом, мы можем получить только те файлы, которые нам нужны. Например, в приведенном ниже коде мы хотим перечислить только файлы Python в нашем каталоге, что мы делаем, указав «*.py» в глобусе.
Листинг 6. Использование pathlib с методом glob
Использование os.scandir()
В Python 3.6 в модуле os становится доступен новый метод. Он называется scandir() и значительно упрощает вызов списка файлов в каталоге.
Сначала импортировав модуль os, используйте метод getcwd() для определения текущего рабочего каталога и сохраните это значение в переменной пути. Затем scandir() возвращает список записей для этого пути, который мы проверяем на наличие файла с помощью метода is_file().
Листинг 7. Чтение содержимого каталога с помощью scandir()
Опять же, вывод листинга 7 идентичен результату из примера 3.
Заключение
Существуют разногласия, какая версия лучше, какая самая элегантная, а какая самая "питоновская". Мне нравится простота метода os.walk(), а также использование модулей fnmatch и pathlib.
Две версии с процессами/конвейерами и итератором требуют более глубокого понимания процессов UNIX и знания Python, поэтому они могут подойти не всем программистам из-за их дополнительной (и ненужной) сложности.
Чтобы найти ответ на вопрос, какая версия самая быстрая, очень удобен модуль timeit. Этот модуль подсчитывает время, прошедшее между двумя событиями.
Чтобы сравнить все наши решения, не изменяя их, мы используем функцию Python: вызываем интерпретатор Python с именем модуля и выполняемым соответствующим кодом Python. Сделать это для всех сценариев Python одновременно помогает сценарий оболочки (Листинг 8).
Листинг 8. Оценка времени выполнения с помощью модуля timeit
Тесты проводились с использованием Python 3.5.3. Результат выглядит следующим образом, тогда как os.walk() дает лучший результат. Выполнение тестов с помощью Python 2 возвращает разные значения, но не меняет порядок — os.walk() по-прежнему находится вверху списка.
Метод Результат для 100 000 000 циклов os.walk td> 0,0085 мкс на цикл подпроцесс/канал 0,00859 мкс на цикл os.listdir/fnmatch 0,00912 мкс на цикл os.listdir/generator 0,00867 мкс на цикл pathlib 0,00854 мкс на цикл pathlib/glob 0,00858 мкс на цикл цикл os.scandir 0,00856 мкс на цикл Благодарности
Автор хотел бы поблагодарить Герольда Рупрехта за его поддержку и комментарии при подготовке этой статьи.
Читайте также: