Краткое описание: в этом уроке вы узнаете, как перечислить файлы в каталоге с помощью функции Python os.walk()
.
Иногда вам может понадобиться перечислить все файлы из каталога для обработки. Например, вы можете захотеть найти все изображения из каталога и изменить размер каждого из них. Чтобы перечислить все файлы в каталоге, можно использовать функцию os.walk()
.
Функция os.
генерирует имена файлов в каталоге, проходя по дереву сверху вниз или снизу вверх. Функция os.walk()
walk()
выдает кортеж с тремя полями (dirpath, dirnames и filenames) для каждого каталога в дереве каталогов.
Обратите внимание, что функция os.walk()
рассматривает все дерево каталогов. Поэтому вы можете использовать ее для получения всех файлов из всех каталогов и их подкаталогов корневого каталога.
Пример файла-списка в Python
Предположим, у вас есть папка D:web
со следующими каталогами и файлами:
Code language: Python (python)D:web ├── assets | ├── css | | └── style.css | └── js | └── app.js ├── blog | ├── read-file.html | └── write-file.html ├── about.html ├── contact.html └── index.html
Следующий пример показывает, как использовать функцию os.walk()
для перечисления всех HTML файлов из каталога D:web
:
Code language: Python (python)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
Как это работает.
Во-первых, инициализируйте список для хранения путей к HTML-файлам:
Code language: Python (python)html_files = []
Во-вторых, вызовите функцию os.walk()
для изучения каталогов папки D:web
:
Code language: Python (python)for dirpath, dirnames, filenames in os.walk(path):
dirpath
хранит каталог, а имена файлов — файлы в этом каталоге.
В-третьих, переберите имена файлов и добавьте их в список html_files
, если их расширения .html
:
Code language: Python (python)# ... for filename in filenames: if filename.endswith('.html'): html_files.append(os.path.join(dirpath, filename))
Обратите внимание, что os.path.join()
возвращает полный путь к имени файла, соединяя dirpath с именем файла.
Наконец, выведите имена файлов в списке html_files
:
Code language: Python (python)for html_file in html_files: print(html_file)
Определение многократно используемой функции списка файлов
Используя функцию os.walk()
, мы можем определить многоразовую функцию list_files()
следующим образом:
Code language: Python (python)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
Сделать функцию list files более эффективной
Если количество файлов невелико, функция list_files()
работает отлично. Однако, когда количество файлов велико, возврат большого списка файлов неэффективен для памяти.
Чтобы решить эту проблему, вы можете использовать генератор для получения каждого файла за раз вместо возврата списка:
Code language: Python (python)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)
Резюме
- Используйте функцию
os.walk()
для рекурсивного перечисления файлов в каталоге. - Определите многократно используемую функцию для перечисления файлов в каталоге с помощью функции
os.walk()
.