#python #string #file #fnmatch
Вопрос:
У меня есть список, где каждая запись состоит из 5 отдельных случайных чисел:
Список-вывод:
... ['00349'] ['02300'] ['00020'] ...
Теперь у меня есть два вложенных цикла for. Внешний цикл повторяет этот список. Внутренний цикл повторяет множество файлов, расположенных в отдельном каталоге. Цель состоит в том, что я хочу проверить каждую запись в списке, содержится ли номер в одном из имен файлов. Если это так, я хочу скопировать эти файлы в отдельный целевой каталог и прервать внутренний цикл, потому что элемент был найден, и продолжить со следующей записью в списке.
Пример структуры файла:
name_01043.json
Я попробовал несколько вещей (см. Ниже), но следующая версия всегда возвращает false.
Вот мой код до сих пор:
from re import search import fnmatch list = [] # some code to fill the list SOURCE_PATH = "dir/source" TARGET_PATH = "dir/target" for item in list: for fname in os.listdir(SOURCE_PATH): # check if fname contains item name: strg1 = str(fname) strg2 = str(item) if fnmatch.fnmatch(fname, strg2): # if fnmatch.fnmatch(fname, '*' strg2 '*'): sourcepath = os.path.join(SOURCE_PATH, fname) shutil.copy(sourcepath, TARGET_PATH) break
Ответ №1:
Вот пример, в котором вы могли бы эффективно использовать модуль glob:
import glob import os import shutil SOURCE_PATH = 'dir/source' TARGET_PATH = 'dir/target' # just use some hard-coded values for the sake of example mylist = ['00349', '02300', '00020'] for e in mylist: for file in glob.glob(os.path.join(SOURCE_PATH, f'*{e}*')): shutil.copy(file, TARGET_PATH)
Комментарии:
1. Прежде всего. спасибо за вашу помощь. Я попробовал вашу версию, но, к сожалению, все файлы из SOURCE_PATH были скопированы в TARGET_PATH, а не только те, что в списке.
2. Возможно, все файлы соответствуют шаблонам в вашем списке. Приведенный ответ, безусловно, является выборочным. К сожалению, не зная вашего списка и содержимого SOURCE_PATH, невозможно объяснить, что произошло
Ответ №2:
Вы можете использовать что-то вроде этого:
for path, subdirs, files in os.walk(SOURCE_PATH): for file in files: if strg2 in str(file): # Do something
Это для вернет каждый путь, подкаталог и файл из местоположения. Таким образом, вы можете проверять файл за файлом и просто проверять str(file)
, содержит ли он нужную вам строку