как узнать содержимое папки python
Получение списка файлов в директории на Python
Всё чаще современные программисты предпочитают работать с языком программирования Python, потому что он очень гибкий, позволяющий легко взаимодействовать с операционной системой. Он также поставляется с функциями по работе с файловой системой. Решение задачи распечатки списка файлов в директории можно решить используя разные модули: os, subprocess, fnmatch и pathlib. Следующие решения демонстрируют, как успешно воспользоваться этими модулями.
Применение os.walk()
Модуль os содержит длинный список методов, которые касаются работы с файловой системой и операционной системой. Один из них walk(), возвращающий имена файлов в дереве каталогов, двигаясь по дереву сверху вниз или снизу вверх (сверху вниз по умолчанию).
os.walk() возвращает список из трех элементов: имя корневого каталога, список имен вложенных папок и список файлов в текущем каталоге. Он одинаково хорошо работает с интерпретаторами Python 2 и 3.
Использование командной строки, через subprocess
Модуль subprocess позволяет выполнить системную команду и собрать её результат. В нашем случае вызываемая системная команда выглядит следующим образом:
Модуль 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
Directory — это в основном структура, которая содержит все соответствующие документы, файлы и папки.
Модуль os содержит несколько функций для управления каталогами в Python.
Функции каталогов Python
os.access (path, mode) Он использует uid для проверки доступа к пути. |
os.chdir (путь) Он изменяет CWD на путь, указанный пользователем. |
os.chflags (путь, флаги) Используется для установки флагов в числовые флаги. |
os.chmod (path, mode) Используется для изменения режима пути на числовой режим. |
os.chown (path, uid, gid) Изменяет идентификатор группы и владельца пути на числовые uid и gid. |
os.chroot (путь) Он используется для изменения корневого каталога текущего выполняемого процесса на путь, указанный пользователем. |
os.fchdir (fd) Используется для изменения CWD на каталог, представленный в файловом дескрипторе fd. |
os.getcwd() Возвращает текущий рабочий каталог (CWD). |
os.getcwdu() Он возвращает объект Unicode в качестве вывода, представленный CWD. |
os.lchmod (path, mode) Используется для изменения режима пути на числовой. |
os.listdir (путь) Возвращает список, содержащий имена записей в каталоге, заданном путем. |
os.lstat (путь) |
os.makedirs (path [, mode]) Используется для рекурсивного создания каталогов. |
os.mkdir() Он используется для создания нового каталога с указанным путем. |
os.mkfifo (путь [, режим]) |
os.readlink (путь) |
os.removedirs (путь) Используется для рекурсивного удаления соответствующих каталогов. |
os.rename (src, dst) Используется для переименования каталога src в dst. |
os.renames (old, new) Используется для рекурсивного переименования старых каталогов в новый. |
os.rmdir (путь) Используется для удаления каталога, указанного пользователем. |
os.stat (путь) |
1. Создание нового каталога
Модуль Python os предоставляет функцию mkdir() для создания нового каталога.
2. Получить текущий рабочий каталог
Функция getcwd() используется для получения местоположения CWD.
3. Переименовать
Функция rename() используется для переименования CWD.
4. Получить список файлов и каталогов
Функция listdir() используется для получения списка всех каталогов и файлов, имеющихся в текущем каталоге.
Выход:
[‘.android’, ‘.AndroidStudio3.5’, ‘.crashlytics’, ‘.eclipse’, ‘.emulator_console_auth_token’, ‘.gradle’, ‘.idlerc’, ‘.m2’, ‘.nbi’, ‘.netbeans-derby’, ‘.p2’, ‘.PyCharm2019.3’, ‘.RapidMiner’, ‘.tooling’, ‘.vscode’, ‘3D Objects’, ‘Anaconda3’, ‘Anaconda3_1’, ‘AndroidStudioProjects’, ‘AppData’, ‘Application Data’, ‘Contacts’, ‘Cookies’, ‘Desktop’, ‘Documents’, ‘Downloads’, ‘eclipse’, ‘eclipse-workspace’, ‘Favorites’, ‘get-pip.py’, ‘HP’, ‘IntelGraphicsProfiles’, ‘Links’, ‘Local Settings’, ‘MicrosoftEdgeBackups’]
5. Как удалить каталог
Функция rmdir() используется для удаления каталога, который уже пуст. Если каталог не пустой, он не будет удален.
Работа с файлами в Python с помощью модуля OS
Обработка файлов в Python с помощью модуля os включает создание, переименование, перемещение, удаление файлов и папок, а также получение списка всех файлов и каталогов и многое другое.
В индустрии программного обеспечения большинство программ тем или иным образом обрабатывают файлы: создают их, переименовывают, перемещают и так далее. Любой программист должен обладать таким навыком. С этим руководством вы научитесь использовать модуль os в Python для проведения операций над файлами и каталогами вне зависимости от используемой операционной системы.
Важно знать, что модуль os используется не только для работы с файлами. Он включает массу методов и инструментов для других операций: обработки переменных среды, управления системными процессами, а также аргументы командной строки и даже расширенные атрибуты файлов, которые есть только в Linux.
Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.
Вывод текущей директории
Для получения текущего рабочего каталога используется os.getcwd() :
os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:
Создание папки
Для создания папки/каталога в любой операционной системе нужна следующая команда:
После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».
Изменение директории
Менять директории довольно просто. Проделаем это с только что созданным:
Еще раз выведем рабочий каталог:
Создание вложенных папок
Предположим, вы хотите создать не только одну папку, но и несколько вложенных:
Это создаст три папки рекурсивно, как показано на следующем изображении:
Создание файлов
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() :
Это удалит только пустые каталоги.
Получение информации о файлах
Это вернет кортеж с отдельными метриками. В их числе есть следующие:
Для получения конкретного атрибута нужно писать следующим образом:
Операции с каталогами в Python
В этом руководстве мы узнаем об операциях с каталогом в Python. Мы обсудим больше о том, как создавать каталоги, переименовывать каталоги с помощью метода Python os.rename(), удалять и изменять каталоги и многое другое.
Примеры операций
Давайте рассмотрим различные операции с каталогами в Python. Чтобы начать работу с файлом, вам нужно изменить каталог на путь, по которому у нас размещены файлы и папки. Итак, давайте начнем с изменения каталога на наш рабочий путь.
1. Получение списка каталогов – os.listdir()
Вы можете получить список каталогов в определенном месте. Для этого вам нужно использовать функцию listdir (location). Если вы укажете местоположение, функция вернет список строк, содержащих имена каталогов данного местоположения. Следующий код поможет вам понять суть:
Результатом следующего кода будет:
2. Получение текущего каталога – os.getwd()
Как мы уже говорили ранее, вы можете узнать местоположение текущего каталога, в котором вы находитесь, с помощью функции getcwd(). Следующий код проиллюстрирует вам идею:
Результатом следующего кода будет:
Точно так же вы можете реализовать все те функции, о которых говорилось выше.
3. Изменение каталога – os.chdir()
Для этого мы сначала импортируем модуль os, а затем начинаем с использования метода os.chdir() для изменения базового пути нашей программы.
4. Создание каталога – os.mkdir()
Чтобы создать каталог, нам нужно использовать метод os.mkdir(). Создадим каталог с именем «data». Затем мы распечатаем список каталогов внутри пути с помощью метода os.listdir().
5. Переименование каталога – os.rename()
Давайте переименуем созданный каталог данных. Мы изменим имя на data1 с помощью метода os.rename().
6. Удаление каталога – os.rmdir()
Теперь, когда мы создали каталог данных и переименовали его в data1, давайте удалим каталог. Мы можем удалять папки с помощью метода os.rmdir().
ПРИМЕЧАНИЕ: os.rmdir может удалить только пустой каталог.
Итак, чтобы удалить непустой каталог, нам нужно будет использовать модуль shutil. Ниже представлена простая программа для удаления каталога с помощью модуля shutil.
Теперь давайте рассмотрим некоторые теории того, что такое каталоги, как работать с каталогами.
Сводка операций с каталогом
По сути, есть несколько общих функций для доступа к каталогам Python. Функции приведены ниже:
Зачем нам нужно работать с каталогами?
Предположим, вы создаете какое-то программное обеспечение с использованием Python, в котором вам нужно читать и записывать файлы из разных каталогов. Каталоги могут быть динамическими, поэтому вы не можете исправить каталог из своего кода, вам нужно выбирать каталог динамически.
После выбора каталога вам, возможно, придется создать новый каталог или записать в файл или прочитать файл из этого каталога. Для этого в Python появилась возможность работы с каталогами.
Python: Список файлов в каталоге
Использование os.walk()
os.walk() возвращает список из трех элементов. Он содержит имя корневого каталога, список имен подкаталогов и список имен файлов в текущем каталоге. Листинг 1 показывает, как написать это всего с тремя строками кода. Это работает как с интерпретаторами Python 2, так и с интерпретаторами Python 3.
Листинг 1: Обход текущего каталога с помощью ос.прогулка()
Использование командной строки через Подпроцесс
Примечание : Хотя это допустимый способ перечисления файлов в каталоге, он не рекомендуется, поскольку он вводит возможность для атак с использованием командных инъекций.
Пример 1: Перечисление файлов в текущем каталоге
Листинг 2: Определение двух процессов, связанных с трубой
Пример 2: Запуск программы
Это решение довольно хорошо работает как с Python2, так и с Python3, но можем ли мы как-то улучшить его? Тогда давайте посмотрим на другие варианты.
Объединение ОС и fnmatch
Наконец, с помощью fnmatch мы фильтруем записи, которые ищем, и печатаем соответствующие записи в stdout. Листинг 3 содержит скрипт Python и Пример 3 соответствующий вывод.
Листинг 3: Список файлов с использованием модуля os и fnmatch
Пример 3: Выходные данные листинга 3
Использование os.listdir() и генераторов
Следующий вариант объединяет метод listdir() модуля os с функцией генератора. Код работает как с версиями 2, так и с версиями 3 Python.
Листинг 4: Объединение os.listdir() и функция генератора
Используйте path lib
Модуль pathlib описывает себя как способ “Анализировать, строить, тестировать и иным образом работать с именами файлов и путями с использованием объектно-ориентированного API вместо низкоуровневых строковых операций”. Это звучит круто – давайте сделаем это. Начиная с Python 3, модуль относится к стандартному дистрибутиву.
В Листинге 5 мы сначала определяем каталог. Точка (“.”) определяет текущий каталог. Затем метод iterator() возвращает итератор, который выдает имена всех файлов. В цикле for мы печатаем имена файлов один за другим.
Листинг 5: Чтение содержимого каталога с помощью pathlib
Листинг 6: Использование pathlib с глоб метод
Использование os.scandir()
Листинг 7: Чтение содержимого каталога с помощью скандир()
Вывод
Две версии с процессами/конвейерами и итератором требуют более глубокого понимания процессов 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 на петлю |
Признание
Автор хотел бы поблагодарить Герольда Рупрехта за его поддержку и комментарии при подготовке этой статьи.