#python #regex
Вопрос:
Я использую ОС.пройдите, чтобы просмотреть каталог, содержащий пронумерованные папки, например DOY100, DOY101, DOY102 и т. Д. Моя цель состоит в том, чтобы возвращать файлы в каждом пронумерованном каталоге, если они находятся в пределах определенного верхнего/нижнего предела, т. Е. Возвращать только файлы в папках с DOY109 по DOY158, где 109 и 158 являются пользовательскими ограничениями.
Вот фрагмент кода Python, с которым я сейчас работаю:
DOY_START = 109
DOY_END = 158
regex = re.compile('(file1_regex.txt)|file2_regex.txt')
rootdir = "C:/Users/Inputs/..."
output_dir = "C:/Users/Outputs/..."
exclude = set(['DOY100', 'DOY101', ... , 'DOY108', 'DOY159', ...])
for root, dirs, files in os.walk(rootdir, topdown=True):
dirs[:] = [d for d in dirs if d not in exclude]
for file in files:
res = re.match(regex, file)
if res:
full_file_path = root "/" file
copy2(full_file_path, output_dir)
Комментарии:
1. В чем именно заключается ваш вопрос?
2. Как я мог исключить все каталоги из своей операционной системы. прогулка, которая выходит за рамки определенного пользователем диапазона DOY_START и DOY_END?
3. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.
Ответ №1:
Вы можете использовать регулярное DOY(?P<num>d )
выражение, чтобы получить только номера суффиксов папки. Затем проверьте, находится ли число в желаемом диапазоне ( DOY_START
<= num <= DOY_END
). Затем используйте shutil.copytree
для копирования файлов из источника в место назначения (используя аргумент из Python 3.8 dirs_exist_ok
, чтобы избежать возникновения исключения в случае, если dst или любой отсутствующий родительский каталог уже существует).
Дерево входных папок
Users
├───Inputs
│ ├───DOY100
│ │ sample_100.dat
│ ├───DOY101
│ │ sample_101.dat
│ ├───DOY102
│ │ sample_102.dat
... ...
... ...
│ ├───DOY197
│ │ sample_197.dat
│ ├───DOY198
│ │ sample_198.dat
│ └───DOY199
│ sample_199.dat
└───Outputs
import re
import os
import shutil
DOY_START = 109
DOY_END = 158
regex = re.compile(r'DOY(?P<num>d )')
rootdir = "Users/Inputs/"
output_dir = "Users/Outputs/"
for root, dirs, files in os.walk(rootdir, topdown=True):
for d in dirs:
match = regex.search(d)
if match:
if DOY_START <= int(match['num']) <= DOY_END:
full_file_path = os.path.join(root, d)
# New in version 3.8: The dirs_exist_ok parameter.
shutil.copytree(full_file_path, output_dir, dirs_exist_ok=True)
Дерево выходных папок
Users
├── Inputs
└── Outputs
├── sample_109.dat
├── sample_110.dat
├── ...
├── ...
├── sample_157.dat
└── sample_158.dat