Как найти все .txt файлы в Python: полное руководство
Узнайте несколько методов поиска всех .txt файлов в директории с помощью Python. Сравните подходы pathlib, os.listdir, glob и os.scandir с тестами производительности и полными примерами кода.
Как найти все файлы с расширением .txt в каталоге с помощью Python?
Чтобы найти все файлы с расширением .txt в каталоге с помощью Python, можно использовать несколько методов, включая pathlib.Path().glob("*.txt"), os.listdir() с сопоставлением строк, glob.glob("*.txt") или os.scandir() для лучшей производительности. Наиболее современный и читаемый подход - использование модуля pathlib, в то время как os.listdir() обычно обеспечивает лучшую производительность для простого сканирования каталогов.
Содержание
- Использование pathlib для современного кода Python
- Использование os.listdir() с сопоставлением строк
- Использование модуля glob для сопоставления шаблонов
- Использование os.scandir() для лучшей производительности
- Рекурсивный поиск в подкаталогах
- Сравнение производительности и лучшие практики
- Полные примеры кода
Использование pathlib для современного кода Python
Модуль pathlib предоставляет объектно-ориентированный интерфейс для файловых путей и является рекомендуемым современным подходом для операций с файловой системой в Python. Чтобы найти все файлы .txt в каталоге:
from pathlib import Path
# Получение текущего рабочего каталога
path = Path().cwd()
# Поиск всех файлов .txt в каталоге
txt_files = [str(f) for f in path.glob("*.txt")]
Этот подход использует метод glob(), который поддерживает шаблоны подстановки в стиле Unix shell. Согласно блогу Finxter, модуль pathlib используется для представления путей файловой системы, подходящих для разных операционных систем, что делает ваш код более переносимым.
Для конкретного пути каталога:
from pathlib import Path
directory = Path("/путь/к/вашему/каталогу")
txt_files = [str(f) for f in directory.glob("*.txt")]
Подход с использованием pathlib чистый, читаемый и работает последовательно на разных операционных системах.
Использование os.listdir() с сопоставлением строк
Функция os.listdir() - один из самых простых способов получить все файлы в каталоге, и вы можете отфильтровать их по расширению с помощью строковых методов:
import os
directory = "/путь/к/вашему/каталогу"
txt_files = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith(".txt")]
Согласно обсуждению на Stack Overflow, этот метод в 1.7 раза быстрее, чем следующий лучший вариант (os.walk()) и в 2.7 раза быстрее, чем pathlib.
Функция os.path.join() обеспечивает правильное построение путей на разных операционных системах, что делает ваш код более переносимым.
Использование модуля glob для сопоставления шаблонов
Модуль glob предоставляет функциональность сопоставления шаблонов, аналогичную подстановкам в стиле Unix shell. Это особенно полезно для более сложного сопоставления шаблонов:
import glob
import os
# Смена целевого каталога
os.chdir("/путь/к/вашему/каталогу")
# Поиск всех файлов .txt
txt_files = glob.glob("*.txt")
# Или получение полных путей
txt_files = [os.path.join("/путь/к/вашему/каталогу", f) for f in glob.glob("*.txt")]
Как показано в документации Sentry, этот прямой подход. Однако, как отмечено в исследованиях, glob.glob() обычно медленнее, чем os.listdir() для простого сопоставления по расширению.
Использование os.scandir() для лучшей производительности
os.scandir() - это улучшенная версия os.listdir(), которая обеспечивает лучшую производительность, особенно для больших каталогов. Она возвращает записи каталога как объекты DirEntry, которые содержат дополнительную информацию о файлах:
import os
directory = "/путь/к/вашему/каталогу"
txt_files = []
with os.scandir(directory) as entries:
for entry in entries:
if entry.is_file() and entry.name.endswith(".txt"):
txt_files.append(os.path.join(directory, entry.name))
Согласно ресурсу Learn by Example, os.scandir() обеспечивает эффективность и более подробные детали, когда требуется информация о файлах. Также руководство Carmatec рекомендует os.scandir() как более быстрый, чем os.listdir() для больших каталогов.
Объекты DirEntry предоставляют методы, такие как is_file() и is_dir(), которые могут быть более эффективными, чем отдельные вызовы функций os.path.
Рекурсивный поиск в подкаталогах
Если вам нужно найти файлы .txt во всех подкаталогах рекурсивно, у вас есть несколько вариантов:
Использование os.walk()
import os
directory = "/путь/к/вашему/каталогу"
txt_files = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".txt"):
txt_files.append(os.path.join(root, file))
Использование pathlib с рекурсивным шаблоном
from pathlib import Path
directory = Path("/путь/к/вашему/каталогу")
txt_files = [str(f) for f in directory.rglob("*.txt")]
Как упоминается в статье на GeeksforGeeks, для поиска файлов с определенными расширениями рекурсивно используется шаблон **/*.txt. Метод rglob() в pathlib эквивалентен использованию glob("**/*.txt").
Сравнение производительности и лучшие практики
На основе результатов исследований, вот сравнение производительности различных методов:
| Метод | Производительность | Лучше всего подходит | Читаемость |
|---|---|---|---|
os.listdir() |
Самый быстрый (базовый) | Простое сканирование каталога | Хорошая |
os.scandir() |
Очень быстрый, особенно для больших каталогов | Большие каталоги, метаданные файлов | Отличная |
pathlib.glob() |
Медленнее (в 2.7 раза медленнее, чем os.listdir) | Современный, читаемый код | Отличная |
glob.glob() |
Самый медленный (в 3.3 раза медленнее, чем os.listdir) | Сложное сопоставление шаблонов | Хорошая |
Согласно анализу на Stack Overflow, os.listdir() - самый быстрый метод для этой задачи, в то время как pathlib предоставляет наиболее читаемый и поддерживаемый код.
Лучшие практики:
- Используйте
pathlibдля нового кода - он более читаемый и переносимый - Используйте
os.scandir()для критически важных к производительности приложений с большими каталогами - Используйте
glob.glob(), когда вам нужно сложное сопоставление шаблонов - Всегда используйте
os.path.join()или оператор/pathlib для построения путей - Рассмотрите возможность использования менеджеров контекста (
withstatements) для управления ресурсами
Полные примеры кода
Вот полные, рабочие примеры для каждого подхода:
Пример 1: Использование pathlib (Рекомендуется)
from pathlib import Path
def find_txt_files_with_pathlib(directory):
"""Найти все файлы .txt с помощью pathlib"""
path = Path(directory)
return [str(f) for f in path.glob("*.txt")]
# Использование
txt_files = find_txt_files_with_pathlib("/путь/к/каталогу")
print(f"Найдено {len(txt_files)} файлов .txt")
for file in txt_files:
print(file)
Пример 2: Использование os.listdir (Самый быстрый)
import os
def find_txt_files_with_listdir(directory):
"""Найти все файлы .txt с помощью os.listdir"""
if not os.path.exists(directory):
return []
txt_files = []
for item in os.listdir(directory):
if item.endswith('.txt') and os.path.isfile(os.path.join(directory, item)):
txt_files.append(os.path.join(directory, item))
return txt_files
# Использование
txt_files = find_txt_files_with_listdir("/путь/к/каталогу")
print(f"Найдено {len(txt_files)} файлов .txt")
for file in txt_files:
print(file)
Пример 3: Использование os.scandir (Лучшая производительность для больших каталогов)
import os
def find_txt_files_with_scandir(directory):
"""Найти все файлы .txt с помощью os.scandir"""
if not os.path.exists(directory):
return []
txt_files = []
with os.scandir(directory) as entries:
for entry in entries:
if entry.is_file() and entry.name.endswith('.txt'):
txt_files.append(entry.path)
return txt_files
# Использование
txt_files = find_txt_files_with_scandir("/путь/к/каталогу")
print(f"Найдено {len(txt_files)} файлов .txt")
for file in txt_files:
print(file)
Пример 4: Рекурсивный поиск с помощью pathlib
from pathlib import Path
def find_txt_files_recursive(directory):
"""Найти все файлы .txt рекурсивно"""
path = Path(directory)
return [str(f) for f in path.rglob("*.txt")]
# Использование
txt_files = find_txt_files_recursive("/путь/к/каталогу")
print(f"Рекурсивно найдено {len(txt_files)} файлов .txt")
for file in txt_files:
print(file)
Заключение
Поиск всех файлов с расширением .txt в каталоге с помощью Python можно выполнить несколькими способами, каждый из которых имеет свои преимущества:
- Для современного, читаемого кода: Используйте
pathlib.Path().glob("*.txt")- он чистый, переносимый и следует объектно-ориентированным принципам - Для максимальной производительности: Используйте
os.listdir()с сопоставлением строк - это самый быстрый метод согласно тестам производительности - Для больших каталогов: Используйте
os.scandir()для лучшей производительности и дополнительных метаданных файлов - Для рекурсивного поиска: Используйте
pathlib.rglob("*.txt")илиos.walk()для обхода подкаталогов
Выберите метод, который лучше всего соответствует вашим конкретным потребностям, исходя из требований к производительности, предпочтений в читаемости кода и сложности операций с файловой системой. Для большинства приложений подход с использованием pathlib обеспечивает наилучший баланс производительности, читаемости и поддерживаемости.
Источники
- Find all files in a directory with extension .txt in Python - Stack Overflow
- How to Find Files With a Certain Extension Only in Python | Delft Stack
- Find all files in a directory with extension .txt in Python – Be on the Right Side of Change
- How to find all files in a directory with extension .txt in Python? - Tutorialspoint
- Python - List files in directory with extension - GeeksforGeeks
- Python - Loop through files of certain extensions - GeeksforGeeks
- How to Get a List of All Files in a Directory With Python – Real Python
- Python List all Files in a Directory - Spark By Examples
- Find all files in a directory with a given extension using Python | Sentry
- Organize, Search, and Back Up Files with Python’s Pathlib - KDnuggets