#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
алфавитным порядком.)