Рекурсивный поиск и копирование файлов из многих папок

#python #pandas #glob #pathlib

Вопрос:

У меня есть несколько файлов в массиве, которые я хочу рекурсивно искать во многих папках

Примером массива имен файлов является [‘A_010720_X.txt’,’B_120720_Y.txt’]

Пример структуры папок приведен ниже, который я также могу предоставить в виде массива, например [‘A’,’B’] и [‘2020-07-01′,’2020-07-12’]. «DL» остается одинаковым для всех.

C:A2020-07-01DL C:B2020-07-12DL

и т.д.

Я пытался использовать shutil, но, похоже, он не работает эффективно для моего требования, так как я могу передать только полное имя файла, а не подстановочный знак. Код, который я использовал с shutil, который работает, но без подстановочных знаков и с абсолютным полным именем файла и путем, например, приведенный ниже код даст мне только A_010720_X.txt

Я считаю, что лучше всего использовать glob или pathlib, которые я раньше не использовал или не могу найти хороших примеров, аналогичных моему варианту использования

     import shutil
    filenames_i_want = ['A_010720_X.txt','B_120720_Y.txt']
    RootDir1 = r'C:A2020-07-01DL'
    TargetFolder = r'C:ELKLOGSATHDEST'
    for root, dirs, files in os.walk((os.path.normpath(RootDir1)), topdown=False):
        for name in files:
            if name in filenames_i_want:
                print ("Found")
                SourceFolder = os.path.join(root,name)
                shutil.copy2(SourceFolder, TargetFolder) 
 

Ответ №1:

Я думаю, что это должно сделать то, что вам нужно, предполагая, что все они являются файлами .txt.

 import glob
import shutil

filenames_i_want = ['A_010720_X.txt','B_120720_Y.txt']
TargetFolder = r'C:ELKLOGSATHDEST'
all_files = []
for directory in ['A', 'B']:
    files = glob.glob('C:{}*DL*.txt'.format(directory))
    all_files.append(files)
for file in all_files:
    if file in filenames_i_want:
        shutil.copy2(file, TargetFolder) 
 

Комментарии:

1. я попытался сделать следующее, но, похоже, это не сработало. Я покажу вам свою структуру папок. Может быть, я что-то упускаю. Я не видел использования [‘2020-07-01′,’2020-07-12’] в вашем коде, так как есть подпапка с параметром даты. Структура файлов для этих двух файлов такова Z:A2021-07-01DLA_010721_013738_0437_AT_B.txt.bz2 Z:B2021-07-01DLB_010721_183722_0643_AT_B.txt.bz2 Я помещу свой код в следующий комментарий

2. импортируйте глобус, импортируйте имена файлов shutiles_i_want = [‘A_010721_013738_0437_AT_B.txt.bz2′,’B_010721_183722_0643_AT_B.txt.bz2’] tra=[‘A’,’B’] Целевая папка = r’C:ELKLOGSATHDEST’ all_files = [] для каталога в tra: файлы = глобус.глобус(‘Z:{}*DL*.bz2’.формат(каталог)) все файлы.добавить(файлы) для файла в all_files: если файл в именах_файлов_и_желает: shutil.copy2(файл, целевая папка)

3. Проверено с помощью этого, но это не дает никаких ошибок. Похоже, он не находит файл. импортировать глобус импортировать имена файлов shutiles_i_want = [‘70631′,’70632′,’тест’] поезд=[‘7063′] Целевая папка = r’C:ELKLOGSATHDEST’ all_files = [] для каталога в поезде: #файлы = глоб.глоб(‘C:{}2021-07-19asts_data_logger*.txt.bz2’.формат(каталог)) файлы=глоб.глоб(‘C:ELKLOGSATH{}2021-07-19asts_data_logger*.txt’.формат(каталог)) all_files.добавить(файлы) для файла в all_files: если файл в именах файлов_i_want: shutil.copy2(файл, целевая папка) печать(«найдено»)