Регулярное выражение для сортировки файлов в пронумерованных папках с помощью os.walk

#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