Python Список файлов

Краткое описание: в этом уроке вы узнаете, как перечислить файлы в каталоге с помощью функции Python os.walk().

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

Функция os.walk() генерирует имена файлов в каталоге, проходя по дереву сверху вниз или снизу вверх. Функция os.walk() выдает кортеж с тремя полями (dirpath, dirnames и filenames) для каждого каталога в дереве каталогов.

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

Пример файла-списка в Python

Предположим, у вас есть папка D:web со следующими каталогами и файлами:

D:web ├── assets | ├── css | | └── style.css | └── js | └── app.js ├── blog | ├── read-file.html | └── write-file.html ├── about.html ├── contact.html └── index.html
Code language: Python (python)

Следующий пример показывает, как использовать функцию os.walk() для перечисления всех HTML файлов из каталога D:web:

import os path = 'D:\web' html_files = [] for dirpath, dirnames, filenames in os.walk(path): for filename in filenames: if filename.endswith('.html'): html_files.append(os.path.join(dirpath, filename)) for html_file in html_files: print(html_file)
Code language: Python (python)

Вывод:

D:webabout.html D:webcontact.html D:webindex.html D:webblogread-file.html D:webblogwrite-file.html
Code language: Python (python)

Как это работает.

Во-первых, инициализируйте список для хранения путей к HTML-файлам:

html_files = []
Code language: Python (python)

Во-вторых, вызовите функцию os.walk() для изучения каталогов папки D:web:

for dirpath, dirnames, filenames in os.walk(path):
Code language: Python (python)

dirpath хранит каталог, а имена файлов — файлы в этом каталоге.

В-третьих, переберите имена файлов и добавьте их в список html_files, если их расширения .html:

# ... for filename in filenames: if filename.endswith('.html'): html_files.append(os.path.join(dirpath, filename))
Code language: Python (python)

Обратите внимание, что os.path.join() возвращает полный путь к имени файла, соединяя dirpath с именем файла.

Наконец, выведите имена файлов в списке html_files:

for html_file in html_files: print(html_file)
Code language: Python (python)

Определение многократно используемой функции списка файлов

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

import os def list_files(path, extentions=None): """ List all files in a directory specified by path Args: path - the root directory path extensions - a iterator of file extensions to include, pass None to get all files. Returns: A list of files specified by extensions """ filepaths = [] for root, _, files in os.walk(path): for file in files: if extentions is None: filepaths.append(os.path.join(root, file)) else: for ext in extentions: if file.endswith(ext): filepaths.append(os.path.join(root, file)) return filepaths if __name__ == '__main__': filepaths = list_files(r'D:web', ('.html', '.css')) for filepath in filepaths: print(filepath)
Code language: Python (python)

Вывод:

D:webabout.html D:webcontact.html D:webindex.html D:webassetscssstyle.css D:webblogread-file.html D:webblogwrite-file.html
Code language: Python (python)

Сделать функцию list files более эффективной

Если количество файлов невелико, функция list_files() работает отлично. Однако, когда количество файлов велико, возврат большого списка файлов неэффективен для памяти.

Чтобы решить эту проблему, вы можете использовать генератор для получения каждого файла за раз вместо возврата списка:

import os def list_files(path, extentions=None): """ List all files in a directory specified by path Args: path - the root directory path extensions - a iterator of file extensions to include, pass None to get all files. Returns: A list of files specified by extensions """ for root, _, files in os.walk(path): for file in files: if extentions is None: yield os.path.join(root, file) else: for ext in extentions: if file.endswith(ext): yield os.path.join(root, file) if __name__ == '__main__': filepaths = list_files(r'D:web', ('.html', '.css')) for filepath in filepaths: print(filepath)
Code language: Python (python)

Резюме

  • Используйте функцию os.walk() для рекурсивного перечисления файлов в каталоге.
  • Определите многократно используемую функцию для перечисления файлов в каталоге с помощью функции os.walk().

Оцените статью
devanswers.ru
Добавить комментарий