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