#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(файл, целевая папка) печать(«найдено»)