10

Найти все файлы с расширением .txt в директории на Python

20

У меня возникла проблема с поиском всех файлов в директории с расширением .txt на Python. Как я могу это сделать?

Я пробовал разные методы, но не смог найти подходящий. Буду благодарен за любые советы или примеры кода!

5 ответ(ов)

2

Что-то подобное должно справиться с задачей:

for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith('.txt'):
            print(file)

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

1

Что-то вроде этого будет работать:

>>> 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 в указанной папке.

0

Попробуйте следующий код, который рекурсивно найдёт все ваши файлы:

import glob
import os

os.chdir("H:\\wallpaper")  # укажите нужную вам директорию

# используйте двойной обратный слэш \\ вместо одинарного \

for file in glob.glob("**/*.txt", recursive=True):
    print(file)

Этот код изменяет текущую директорию на указанную и ищет все файлы с расширением .txt в ней и во всех её подкаталогах.

0

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.

0

Ваш код на Python правильно извлекает из указанной директории все файлы с расширением .txt. Вот как он работает:

  1. Импортируется модуль os, который предоставляет функции для взаимодействия с операционной системой.
  2. Переменной path присваивается строка, содержащая путь к директории, в которой вы хотите просмотреть файлы.
  3. С помощью функции os.listdir(path) получаете список всех файлов и папок в указанной директории path.
  4. Затем вы используете генератор списков, чтобы создать новый список 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}")

Этот подход поможет вам избежать сбоев при выполнении программы в случае, если указанный путь неверен.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь