Найти все файлы с расширением .txt в директории на Python
У меня возникла проблема с поиском всех файлов в директории с расширением .txt
на Python. Как я могу это сделать?
Я пробовал разные методы, но не смог найти подходящий. Буду благодарен за любые советы или примеры кода!
5 ответ(ов)
Что-то подобное должно справиться с задачей:
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.txt'):
print(file)
Этот код использует функцию os.walk()
для рекурсивного обхода всех файлов в указанной директории. Он проверяет, заканчивается ли имя файла на '.txt', и если да, то выводит его на экран. Убедитесь, что вы импортировали модуль os
, прежде чем использовать этот код.
Что-то вроде этого будет работать:
>>> import os
>>> path = '/usr/share/cups/charmaps'
>>> text_files = [f for f in os.listdir(path) if f.endswith('.txt')]
>>> text_files
['euc-cn.txt', 'euc-jp.txt', 'euc-kr.txt', 'euc-tw.txt', ... 'windows-950.txt']
Этот код импортирует модуль os
, задает путь к директории и создает список всех файлов с расширением .txt
в указанной папке.
Попробуйте следующий код, который рекурсивно найдёт все ваши файлы:
import glob
import os
os.chdir("H:\\wallpaper") # укажите нужную вам директорию
# используйте двойной обратный слэш \\ вместо одинарного \
for file in glob.glob("**/*.txt", recursive=True):
print(file)
Этот код изменяет текущую директорию на указанную и ищет все файлы с расширением .txt
в ней и во всех её подкаталогах.
Python v3.5+
Быстрый метод с использованием os.scandir
в рекурсивной функции. Эта функция ищет все файлы с указанным расширением в папке и подкаталогах. Она работает быстро, даже для поиска десяти тысяч файлов.
Я также включил функцию для преобразования результатов в DataFrame Pandas.
import os
import re
import pandas as pd
import numpy as np
def findFilesInFolderYield(path, extension, containsTxt='', subFolders=True, excludeText=''):
"""
Рекурсивная функция для поиска всех файлов определенного типа расширения в папке
(и, при необходимости, во всех подкаталогах тоже)
path: Основная директория для поиска файлов
extension: Расширение файла для поиска. Например, 'txt'. Или регулярное выражение, такое как 'ls\d', для соответствия ls1, ls2, ls3 и т.д.
containsTxt: Список строк. Найдет файл только если он содержит этот текст. Игнорируется, если '' (или пусто)
subFolders: Bool. Если True, ищет файлы во всех подкаталогах в указанной папке. Если False, ищет только в заданной папке.
excludeText: Строка текста. Игнорируется, если ''. Исключит, если текстовая строка присутствует в пути.
"""
if type(containsTxt) == str: # если это строка, а не список
containsTxt = [containsTxt]
myregexobj = re.compile('\.' + extension + '$') # Убедимся, что расширение файла стоит на конце и предшествует точка
try: # Ловим ошибку OSError или FileNotFoundError: Проблема с правами доступа, как я полагаю
for entry in os.scandir(path):
if entry.is_file() and myregexobj.search(entry.path): #
bools = [True for txt in containsTxt if txt in entry.path and (excludeText == '' or excludeText not in entry.path)]
if len(bools) == len(containsTxt):
yield entry.stat().st_size, entry.stat().st_atime_ns, entry.stat().st_mtime_ns, entry.stat().st_ctime_ns, entry.path
elif entry.is_dir() and subFolders: # если это директория, повторяем процесс как вложенная функция
yield from findFilesInFolderYield(entry.path, extension, containsTxt, subFolders)
except OSError as ose:
print('Не удается получить доступ к ' + path + '. Возможно, ошибка прав доступа ', ose)
except FileNotFoundError as fnf:
print(path + ' не найден ', fnf)
def findFilesInFolderYieldandGetDf(path, extension, containsTxt, subFolders=True, excludeText=''):
"""
Преобразует возвращенные данные из findFilesInFolderYield и создает DataFrame Pandas.
Рекурсивная функция для поиска всех файлов определенного типа расширения в папке
(и, при необходимости, во всех подкаталогах тоже)
path: Основная директория для поиска файлов
extension: Расширение файла для поиска. Например, 'txt'. Или регулярное выражение, такое как 'ls\d', для соответствия ls1, ls2, ls3 и т.д.
containsTxt: Список строк. Найдет файл только если он содержит этот текст. Игнорируется, если '' (или пусто)
subFolders: Bool. Если True, ищет файлы во всех подкаталогах в указанной папке. Если False, ищет только в заданной папке.
excludeText: Строка текста. Игнорируется, если ''. Исключит, если текстовая строка присутствует в пути.
"""
fileSizes, accessTimes, modificationTimes, creationTimes, paths = zip(*findFilesInFolderYield(path, extension, containsTxt, subFolders))
df = pd.DataFrame({
'FLS_File_Size': fileSizes,
'FLS_File_Access_Date': accessTimes,
'FLS_File_Modification_Date': np.array(modificationTimes).astype('timedelta64[ns]'),
'FLS_File_Creation_Date': creationTimes,
'FLS_File_PathName': paths,
})
df['FLS_File_Modification_Date'] = pd.to_datetime(df['FLS_File_Modification_Date'], infer_datetime_format=True)
df['FLS_File_Creation_Date'] = pd.to_datetime(df['FLS_File_Creation_Date'], infer_datetime_format=True)
df['FLS_File_Access_Date'] = pd.to_datetime(df['FLS_File_Access_Date'], infer_datetime_format=True)
return df
ext = 'txt' # регулярное выражение
containsTxt = []
path = 'C:\myFolder'
df = findFilesInFolderYieldandGetDf(path, ext, containsTxt, subFolders=True)
Этот код предоставляет вам возможность эффективно искать файлы с заданным расширением в директории и подкаталогах, а затем преобразовывать результаты в удобный формат DataFrame с помощью библиотеки Pandas.
Ваш код на Python правильно извлекает из указанной директории все файлы с расширением .txt
. Вот как он работает:
- Импортируется модуль
os
, который предоставляет функции для взаимодействия с операционной системой. - Переменной
path
присваивается строка, содержащая путь к директории, в которой вы хотите просмотреть файлы. - С помощью функции
os.listdir(path)
получаете список всех файлов и папок в указанной директорииpath
. - Затем вы используете генератор списков, чтобы создать новый список
files_txt
, содержащий только те файлы, которые заканчиваются на.txt
. Это достигается с помощью условияif i.endswith('.txt')
.
Если вам нужно запускать этот код, убедитесь, что путь mypath/path
корректен и директория существует. Если потребуется обработать ошибки (например, если директория не найдена), можно использовать try-except
блок:
import os
path = 'mypath/path'
try:
files = os.listdir(path)
files_txt = [i for i in files if i.endswith('.txt')]
except FileNotFoundError:
print(f"Директория {path} не найдена.")
except Exception as e:
print(f"Произошла ошибка: {e}")
Этот подход поможет вам избежать сбоев при выполнении программы в случае, если указанный путь неверен.
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Правильный способ записи строки в файл?
Как открыть несколько файлов с помощью "with open" в Python?
open() в Python не создает файл, если он не существует
Вывод строки в текстовый файл