Находите и копируйте файлы с помощью glob и shutil

#python #glob #shutil

Вопрос:

У меня есть следующая структура папок

введите описание изображения здесь

Внутри папок папки, файлы в них, как в этом примере

введите описание изображения здесь

Я пытаюсь использовать следующее для анализа папок, но оно ничего не возвращает и не выдает никаких ошибок.

 import glob
import shutil

filenames_i_want = ['70631','70632','test']
tra=['7063']
TargetFolder = r'C:ELKLOGSATHDEST'
all_files = []
for directory in tra:
    files=glob.glob('C:ELKLOGSATH{}*_data*.txt'.format(directory))
    all_files.append(files)
for file in all_files:
    if file in filenames_i_want:
        shutil.copy2(file, TargetFolder)
        print("found")
 

Вышесказанное не работает и не допускает никаких ошибок. Кроме того, поскольку папок с датами много, более эффективным способом будет, если я смогу предоставить массив с датой, например[‘2021-07-19′,’2021-07-20′,’2021-07-21’]. Как я могу передать это глобусу вместо использования*, что означало бы просмотр множества папок

Ответ №1:

glob.glob() Возвращает список путей к файлам в соответствии с документацией. В результате ни один из этих путей к файлам не будет соответствовать тому, что вы настроили filenames_i_want .

Ниже приведен пример, основанный на вашем коде:

 import glob

target_files=["t2.json" "test.json"]
dir="/tmp"
all_files=glob.glob("/tmp/*.json")
for f in all_files:
    if f in target_files:
        print(f"found target file: {f}")
    else:
        print(f"NOT a target file: {f}")
 

Результаты тестового запуска:

 NOT a target file: /tmp/test.json
NOT a target file: /tmp/test2.json
NOT a target file: /tmp/t2.json
NOT a target file: /tmp/test3.json
 

Вы можете попробовать изменить свой код, чтобы использовать только имя файла в проверке по списку filenames_i_want:

 import glob
from pathlib import Path

target_files=["t2.json", "test.json"]
dir="/tmp"
all_files=glob.glob("/tmp/*.json")
for f in all_files:
    current_path=Path(f)
    if current_path.name in target_files:
        print(f"found target file: {f}")
    else:
        print(f"X ---- NOT a target file: {f}")
 

Вывод из измененного кода:

 found target file: /tmp/test.json
X ---- NOT a target file: /tmp/test2.json
found target file: /tmp/t2.json
X ---- NOT a target file: /tmp/test3.json