python: проверьте, является ли определенная строка частью имени файла

#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) , содержит ли он нужную вам строку