Как вывести список файлов python

Содержание
  1. Список файлов в папке/каталоге по шаблону средствами pathlib в Python.
  2. Рекурсивное получение имен файлов по шаблону из дерева каталогов.
  3. Содержание:
  4. Path.glob(pattern) :
  5. Path.rglob(pattern) :
  6. Path.iterdir() :
  7. Получение списка файлов в директории на Python
  8. Применение os.walk()
  9. Использование командной строки, через subprocess
  10. Комбинация os и fnmatch
  11. Использование os.listdir() и генераторов
  12. Использование pathlib
  13. Использование os.scandir()
  14. Вывод
  15. Работа с файлами в Python с помощью модуля OS
  16. Вывод текущей директории
  17. Создание папки
  18. Изменение директории
  19. Создание вложенных папок
  20. Создание файлов
  21. Переименование файлов
  22. Перемещение файлов
  23. Список файлов и директорий
  24. Удаление файлов
  25. Удаление директорий
  26. Получение информации о файлах
  27. Python: Список файлов в каталоге
  28. Использование os.walk()
  29. Использование командной строки через Подпроцесс
  30. Объединение ОС и fnmatch
  31. Использование os.listdir() и генераторов
  32. Используйте path lib
  33. Использование os.scandir()
  34. Вывод
  35. Признание

Список файлов в папке/каталоге по шаблону средствами pathlib в Python.

Рекурсивное получение имен файлов по шаблону из дерева каталогов.

Описанные ниже методы позволяют произвести рекурсивный обход дерева каталога и получить список файлов средствами модуля pathlib . Данные методы принадлежат экземпляру, созданному из класса Path() .

Так как класс pathlib.Path() наследуется от класса pathlib.PurePath() , следовательно он поддерживает все операции по манипуляции с путями файловой системы.

Содержание:

Path.glob(pattern) :

Метод Path.glob() возвращает список всех файлов любого типа, соответствующий заданному шаблону pattern , расположенных в каталоге, указанном в пути path .

Шаблон ‘**’ указывает на рекурсивный обход в глубину каталога, указанного в пути path , и всех его подкаталогов:

Примечание. Использование шаблона ‘**’ в больших деревьях каталогов может занять слишком много времени.

Path.rglob(pattern) :

Метод Path.rglob() работает подобно вызову метода Path.glob() с добавлением конструкции ‘**/’ перед заданным относительным шаблоном pattern , тем самым по умолчанию производит рекурсивный поиск файлов, соответствующих pattern :

Читайте также:  Как отбелить мастику диоксидом титана

Path.iterdir() :

Метод Path.iterdir() вернет итератор объектов пути содержимого каталога, если путь path указывает на каталог:

Смотрите другие методы и свойства, доступные экземпляру класса Path() модуля pathlib .

Источник

Получение списка файлов в директории на Python

Всё чаще современные программисты предпочитают работать с языком программирования Python, потому что он очень гибкий, позволяющий легко взаимодействовать с операционной системой. Он также поставляется с функциями по работе с файловой системой. Решение задачи распечатки списка файлов в директории можно решить используя разные модули: os, subprocess, fnmatch и pathlib. Следующие решения демонстрируют, как успешно воспользоваться этими модулями.

Применение os.walk()

Модуль os содержит длинный список методов, которые касаются работы с файловой системой и операционной системой. Один из них walk(), возвращающий имена файлов в дереве каталогов, двигаясь по дереву сверху вниз или снизу вверх (сверху вниз по умолчанию).

os.walk() возвращает список из трех элементов: имя корневого каталога, список имен вложенных папок и список файлов в текущем каталоге. Он одинаково хорошо работает с интерпретаторами Python 2 и 3.

Использование командной строки, через subprocess

Модуль subprocess позволяет выполнить системную команду и собрать её результат. В нашем случае вызываемая системная команда выглядит следующим образом:

Инструкция 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.

Данное решение работает достаточно хорошо с Python 2 и 3, но его можно улучшить. Рассмотрим другие варианты.

Комбинация os и fnmatch

Решение, использующее подпроцессы, элегантно, но требует большого количества кода. Вместо этого, давайте объединим методы из двух модулей os и fnmatch. Этот вариант также работает с Python 2 и 3.

В качестве первого шага, импортируем модули os и fnmatch. Далее определим каталог, в котором нужно перечислить файлы, используя os.listdir(), а также шаблон для фильтрации файлов. В цикле for выполняется итерация списка записей, хранящихся в переменной listOfFiles.

В завершение, с помощью fnmatch отфильтровываются искомые записи и распечатываются соответствующие записи в stdout.

Использование os.listdir() и генераторов

Следующий вариант объединяет метод os.listdir() с функцией генератором. Код работает как с версиями 2, так и с 3 Python.

Как уже было сказано ранее, listdir() возвращает список записей для данного каталога. Метод os.path.isfile() возвращает True, если данная запись является файлом. Оператор yield завершает работу функции, но сохраняя текущее состояние и возвращает только имя записи являющейся файлом.

Использование pathlib

Модуль pathlib предназначен для парсинга, сборки, тестирования и иной работы с именами файлов и их путями, используя объектно-ориентированный API вместо низкоуровневых строковых операций. Начиная с Python 3 модуль находится в стандартной библиотеке.

В следующем листинге определяется текущий каталог точкой («.»). Затем метод iterdir() возвращает итератор, который возвращает имена всех файлов. Далее циклом for распечатываются имена файлов друг за другом.

В качестве альтернативы, можно отфильтровать файлы по именам с помощью метода glob. Таким образом, получаем требуемые файлы. Например, в приведенном ниже коде перечисляются Python файлы в выбранном каталоге, указав шаблон «*.py» в glob.

Использование os.scandir()

В Python 3.6 добавлен новый метод scandir(), доступный из модуля os. Как понятно из названия он значительно упрощает получение списка файлов в каталоге.

Чтобы определить текущий рабочий каталог и сохранить его, инициализируем значение переменной path, для этого импортируем модуль os и вызовем функцию getcwd(). Далее, scandir() возвращает список записей для выбранного пути, которые проверяются на принадлежность файлу, используя метод is_file().

Вывод

Ведутся споры, какой вариант является лучшим, какой наиболее элегантным и какой является наиболее «питоничным». Мне нравится простота метода os.walk(), а также модули fnmatch и pathlib.

Две версии с процессами/конвейером и итератором требуют более глубокого понимания процессов UNIX и знаний Python, поэтому они не могут быть предпочтительными для всех программистов из-за их дополнительной (и избыточной) сложности.

Чтобы найти ответ на этот вопрос, выберем самой быстрой из них, воспользовавшись удобным модулем timeit. Данный модуль подсчитывает время, прошедшее между двумя событиями.

Для сравнения всех решений без их изменений, воспользуемся функциональностью Python: вызовем интерпретатор с модулем timeit и соответствующим Python скриптом. Для автоматизации процесса напишем shell скрипт

Источник

Работа с файлами в Python с помощью модуля OS

Обработка файлов в Python с помощью модуля os включает создание, переименование, перемещение, удаление файлов и папок, а также получение списка всех файлов и каталогов и многое другое.

В индустрии программного обеспечения большинство программ тем или иным образом обрабатывают файлы: создают их, переименовывают, перемещают и так далее. Любой программист должен обладать таким навыком. С этим руководством вы научитесь использовать модуль os в Python для проведения операций над файлами и каталогами вне зависимости от используемой операционной системы.

Важно знать, что модуль os используется не только для работы с файлами. Он включает массу методов и инструментов для других операций: обработки переменных среды, управления системными процессами, а также аргументы командной строки и даже расширенные атрибуты файлов, которые есть только в Linux.

Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.

Вывод текущей директории

Для получения текущего рабочего каталога используется os.getcwd() :

os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:

Создание папки

Для создания папки/каталога в любой операционной системе нужна следующая команда:

После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».

Если запустить ее еще раз, будет вызвана ошибка FileExistsError , потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:

Функция os.path.isdir() вернет True , если переданное имя ссылается на существующий каталог.

Изменение директории

Менять директории довольно просто. Проделаем это с только что созданным:

Еще раз выведем рабочий каталог:

Создание вложенных папок

Предположим, вы хотите создать не только одну папку, но и несколько вложенных:

Это создаст три папки рекурсивно, как показано на следующем изображении:

Создание файлов

Для создания файлов в Python модули не нужны. Можно использовать встроенную функцию open() . Она принимает название файла, который необходимо создать в качестве первого параметра и желаемый режим открытия — как второй:

w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.

Переименование файлов

С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.

Функция os.rename() принимает 2 аргумента: имя файла или папки, которые нужно переименовать и новое имя.

Перемещение файлов

Функцию os.replace() можно использовать для перемещения файлов или каталогов:

Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем ( renamed-text.txt ), он будет перезаписан.

Список файлов и директорий

Функция os.listdir() возвращает список, который содержит имена файлов в папке. Если в качестве аргумента не указывать ничего, вернется список файлов и папок текущего рабочего каталога:

А что если нужно узнать состав и этих папок тоже? Для этого нужно использовать функцию os.walk() :

os.walk() — это генератор дерева каталогов. Он будет перебирать все переданные составляющие. Здесь в качестве аргумента передано значение «.», которое обозначает верхушку дерева:

Метод os.path.join() был использован для объединения текущего пути с именем файла/папки.

Удаление файлов

Удалим созданный файл:

os.remove() удалит файл с указанным именем (не каталог).

Удаление директорий

С помощью функции os.rmdir() можно удалить указанную папку:

Для удаления каталогов рекурсивно необходимо использовать os.removedirs() :

Это удалит только пустые каталоги.

Получение информации о файлах

Для получения информации о файле в ОС используется функция os.stat() , которая выполняет системный вызов stat() по выбранному пути:

Это вернет кортеж с отдельными метриками. В их числе есть следующие:

    • st_size — размер файла в байтах
    • st_atime — время последнего доступа в секундах (временная метка)
    • st_mtime — время последнего изменения
    • st_ctime — в Windows это время создания файла, а в Linux — последнего изменения метаданных

Для получения конкретного атрибута нужно писать следующим образом:

Источник

Python: Список файлов в каталоге

Автор: Frank Hofmann
Дата записи

Я предпочитаю работать с Python, потому что это очень гибкий язык программирования и позволяет мне легко взаимодействовать с операционной системой. Это также включает в себя функции файловой системы. Чтобы просто перечислить файлы в каталоге, в игру вступают модули os , subprocess , fnmatch и pathlib . Следующие решения демонстрируют, как эффективно использовать эти методы.

Использование os.walk()

Модуль os содержит длинный список методов, которые имеют дело с файловой системой и операционной системой. Один из них – walk() , который генерирует имена файлов в дереве каталогов, проходя по дереву либо сверху вниз, либо снизу вверх (причем по умолчанию используется параметр “сверху вниз”).

os.walk() возвращает список из трех элементов. Он содержит имя корневого каталога, список имен подкаталогов и список имен файлов в текущем каталоге. Листинг 1 показывает, как написать это всего с тремя строками кода. Это работает как с интерпретаторами Python 2, так и с интерпретаторами Python 3.

Листинг 1: Обход текущего каталога с помощью ос.прогулка()

Использование командной строки через Подпроцесс

Примечание : Хотя это допустимый способ перечисления файлов в каталоге, он не рекомендуется, поскольку он вводит возможность для атак с использованием командных инъекций.

Как уже было описано в статье Параллельная обработка в Python , модуль subprocess позволяет выполнить системную команду и собрать ее результат. Системная команда, которую мы вызываем в этом случае, является следующей:

Пример 1: Перечисление файлов в текущем каталоге

Команда ls . перечисляет файлы каталогов для текущего каталога и добавляет разделитель /| в конце имени каждого подкаталога, который нам понадобится на следующем шаге. Вывод этого вызова передается в команду grep , которая фильтрует данные по мере необходимости.

Параметры -v/$ исключают все имена записей, которые заканчиваются разделителем //. На самом деле, /$ — это регулярное выражение, которое соответствует всем строкам, содержащим символ /| как самый последний символ перед концом строки, который представлен символом $ .

Модуль subprocess позволяет создавать реальные каналы и соединять входные и выходные потоки, как это делается в командной строке. Вызов метода подпроцесс.Popen() открывает соответствующий процесс и определяет два параметра с именами stdin и stdout .

В листинге 2 показано, как это запрограммировать. Первая переменная ls определяется как процесс, выполняющий lsp . что выводит в трубу. Вот почему канал stdout определяется как подпроцесс.ТРУБА . Вторая переменная grep тоже определяется как процесс, но вместо этого выполняет команду grep-v/$ .

Чтобы считывать выходные данные команды ls из канала, канал stdin grep определяется как ls.stdout . Наконец, переменная end Of Pipe считывает выходные данные grep из grep.stdout , которые печатаются в stdout по элементам в for -цикле ниже. Вывод виден в Примере 2 .

Листинг 2: Определение двух процессов, связанных с трубой

Пример 2: Запуск программы

Это решение довольно хорошо работает как с Python2, так и с Python3, но можем ли мы как-то улучшить его? Тогда давайте посмотрим на другие варианты.

Объединение ОС и fnmatch

Как вы уже видели, решение с использованием подпроцессов является элегантным, но требует большого количества кода. Вместо этого давайте объединим методы из двух модулей os и fnmatch . Этот вариант также работает с Python 2 и 3.

В качестве первого шага мы импортируем два модуля os и fnmatch . Далее мы определяем каталог, в котором мы хотели бы перечислить файлы , используя os.listdir () , а также шаблон, по которому файлы будут фильтроваться. В цикле for мы перебираем список записей, хранящихся в переменной list Of Files .

Наконец, с помощью fnmatch мы фильтруем записи, которые ищем, и печатаем соответствующие записи в stdout. Листинг 3 содержит скрипт Python и Пример 3 соответствующий вывод.

Листинг 3: Список файлов с использованием модуля os и fnmatch

Пример 3: Выходные данные листинга 3

Использование os.listdir() и генераторов

Проще говоря, генератор-это мощный итератор, который сохраняет свое состояние. Чтобы узнать больше о генераторах, ознакомьтесь с одной из наших предыдущих статей, Python Generators .

Следующий вариант объединяет метод listdir() модуля os с функцией генератора. Код работает как с версиями 2, так и с версиями 3 Python.

Как вы, возможно, уже отмечали ранее, метод listdir() возвращает список записей для данного каталога. Метод os.path.isfile() возвращает True , если данная запись является файлом. Оператор yield завершает работу функции, но сохраняет текущее состояние и возвращает только имя записи, обнаруженной как файл. Это позволяет нам зацикливаться на функции генератора (см. Листинг 4 ). Выходные данные идентичны выходным данным из Примера 3 .

Листинг 4: Объединение os.listdir() и функция генератора

Используйте path lib

Модуль pathlib описывает себя как способ “Анализировать, строить, тестировать и иным образом работать с именами файлов и путями с использованием объектно-ориентированного API вместо низкоуровневых строковых операций”. Это звучит круто – давайте сделаем это. Начиная с Python 3, модуль относится к стандартному дистрибутиву.

В Листинге 5 мы сначала определяем каталог. Точка (“.”) определяет текущий каталог. Затем метод iterator() возвращает итератор, который выдает имена всех файлов. В цикле for мы печатаем имена файлов один за другим.

Листинг 5: Чтение содержимого каталога с помощью pathlib

Опять же, выходные данные идентичны выходным данным из Примера 3 .

В качестве альтернативы мы можем получить файлы, сопоставив их имена с помощью чего-то под названием glob . Таким образом, мы можем получить только те файлы, которые нам нужны. Например, в приведенном ниже коде мы хотим только перечислить файлы Python в нашем каталоге, что мы и делаем, указывая “*.py” в глобусе.

Листинг 6: Использование pathlib с глоб метод

Использование os.scandir()

В Python 3.6 новый метод становится доступным в модуле os . Он называется scandir () и значительно упрощает вызов списка файлов в каталоге.

Сначала импортировав модуль os , используйте метод getcwd() для определения текущего рабочего каталога и сохраните это значение в переменной path . Затем scandir() возвращает список записей для этого пути, который мы тестируем на файл с помощью метода is_file () .

Листинг 7: Чтение содержимого каталога с помощью скандир()

Опять же, вывод Листинга 7 идентичен выводу из Примера 3 .

Вывод

Существует разногласие, какая версия является лучшей, какая-самой элегантной, а какая-самой “питонической”. Мне нравится простота метода os.walk () , а также использование модулей fnmatch и path lib .

Две версии с процессами/конвейерами и итератором требуют более глубокого понимания процессов UNIX и знаний Python, поэтому они могут быть не лучшими для всех программистов из-за их дополнительной (и ненужной) сложности.

Чтобы найти ответ на вопрос, какая версия является самой быстрой, модуль timeit очень удобен. Этот модуль подсчитывает время, прошедшее между двумя событиями.

Чтобы сравнить все наши решения, не изменяя их, мы используем функциональность Python: вызываем интерпретатор Python с именем модуля и соответствующим кодом Python для выполнения. Для этого для всех скриптов Python сразу помогает shell-скрипт ( Листинг 8 ).

Листинг 8: Оценка времени выполнения с помощью timeit модуль

Тесты были проведены с использованием Python 3.5.3. Результат выглядит следующим образом, тогда как os.walk() дает наилучший результат. Запуск тестов с Python 2 возвращает разные значения, но не меняет порядок – os.walk() по-прежнему находится в верхней части списка.

Тесты были проведены с использованием Python 3.5.3. Результат выглядит следующим образом, тогда как || os.walk() || дает наилучший результат. Запуск тестов с Python 2 возвращает разные значения, но не меняет порядок – || os.walk() || по-прежнему находится в верхней части списка. 0,0085 usec на петлю
подпроцесс/труба 0,00859 usec на петлю
подпроцесс/труба 0,00912 usec на петлю
подпроцесс/труба 0,00867 usec на петлю
pathlib 0,00854 usec на петлю
путь lib/glob 0,00858 usec на петлю
путь lib/glob 0,00856 usec на петлю

Признание

Автор хотел бы поблагодарить Герольда Рупрехта за его поддержку и комментарии при подготовке этой статьи.

Источник

Оцените статью