python копирует файлы на основе шаблона регулярных выражений через shutil

#python #regex #shutil

#python #регулярное выражение #shutil

Вопрос:

Я новичок в stackoverflow, а также в программировании, и я пытаюсь решить довольно трудоемкую проблему в офисе. Мы хотели бы скопировать файлы на основе их имени файла в другое место или добавить их в ZIP-файл.

Имя файла выглядит следующим образом 16410_REC-7372-20201102161426.PDF.

Важными частями являются:

  • нам нужно выбирать только файлы, содержащие префикс ‘REC’
  • следующие 4 цифры представляют собой числовой диапазон желаемых документов, который необходимо будет указать с помощью пользовательского ввода
  • наконец, файлы, которые попадают в числовой диапазон, необходимо скопировать в новое место назначения или, альтернативно, добавить в zip-файл

Единственное, над чем я пока работаю, — это копировать файлы на основе окончания файла в другое место. Из того, что я прочитал, это можно было бы сделать с помощью регулярных выражений (строка, которую, я думаю, я мог бы создать), но мне не хватает, как реализовать выделение в python.

Вот код до сих пор:

 from os.path import isfile
import os
import shutil

source = os.listdir("n:/DIESTEIN/DSCS/Dokumente/")
destination = "n:/Test/"

print('select starting number: ')
f_start = input()

print('select ending number: ')
f_end = input()

for files in source:
    if files.endswith(".txt"):
        shutil.copy(files, destination)
  

Я надеюсь, что кто-нибудь может указать мне правильное направление или помочь мне написать код?

Приветствия, Маркус

Ответ №1:

Для поиска статического шаблона вам действительно не нужны регулярные выражения.

Кроме того, я бы изменил ваш скрипт, чтобы он просто просматривал текущий каталог; тогда его легко протестировать на наборе файлов, которые вы хотите протестировать, без необходимости экспериментировать с реальным местом производства.

 # from os.path import isfile  <- unused, comment out
import os
import shutil

destination = "n:/Test/"

f_start = int(input('select starting number: '))
f_end = int(input('select ending number: '))

for file in os.listdir("."):
    if "_REC-" in file and f_start <= int(file.split("-")[1]) <= f_end:
        shutil.copy(file, destination)
  

Если вы действительно хотели использовать регулярные выражения, возможно, что-то вроде

 import re

pattern = re.compile(r"d _REC-(d )-d .PDF")
...
    matching = pattern.match(file)
    if matching and f_start <= int(matching.group(1)) <= f_end:
  

Регулярное выражение налагает более строгую проверку на соответствие имени файла ожидаемому шаблону (где, конечно, я должен был догадаться, чего именно вы ожидаете). Если у вас есть файлы, которые содержат _REC- , но не соответствуют шаблону, возможно, регулярное выражение было бы полезно. Но для простых требований легче увидеть, что делает код, если вы просто выделите имя файла достаточно, чтобы извлечь нужные вам части, и тогда вам пока не нужно учиться читать регулярные выражения. (Например, если это недостаточно строго, может быть, также проверьте, начинается ли имя файла с числа и заканчивается .PDF ?)

Обратите внимание также, как нам нужно преобразовать строки, содержащие числа int , в для выполнения числовых сравнений. (Если вы забудете, "123" будет казаться «меньшим», чем "22" потому 1 , что идет перед 2 алфавитным порядком.)