Как мне переместить файлы в папки, основываясь на части их имени? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть куча файлов, которые загружаются с сервера, и я искал этот вопрос на SO, и ни одно из решений для меня не работает.

Мои файлы выглядят так:

date1_A.gz
date1_B.gz
date1_C.gz
date2_A.gz
date2_B.gz
date2_C.gz

У меня есть два месяца на 10 переменных.Я хочу определить, что это за переменные (например, A, B, C) и поместить каждый файл в папку, основываясь на том, что он говорит от их имени.Таким образом, из моих загрузок можно перейти прямо в папку с 10 папками, в которой у каждой папки есть файлы.

Я попытался запустить цикл for, который анализировал файлы и помещал их в новое место:

dir_name = "/Users/mee/Downloads/batch_files"

for subdir, dirs, files in os.walk(dir_name):
    for d in dirs:
        for file in files:
            the_file = os.path.join(subdir, file)
            if d in the_file:
                new_loc = subdir + '\\' + d + '\\' + file
                os.rename(the_file, new_loc)

В идеале мои файлы должны идти из моих загрузок в каталог, который я создаю, что приводит к папке с 10 папками внутри нее для каждой отдельной области данных, такой как A, B, C.

1 Ответ

0 голосов
/ 09 июля 2019

Сначала я соблазню создать словарь регулярных выражений, который вы можете использовать для категоризации вашего имени файла:

import re

f_matcher = { "typeA" : re.compile("date.*A\.gz"), 
              "typeB" : re.compile("date.*B\.gz"), 
              "typeC" : re.compile("date.*C\.gz") }

Если вы не уверены в использовании регулярных выражений, попробуйте regex101 , который является отличным учебным ресурсом для этого мощного набора инструментов для сопоставления с образцом.

Затем определите отображение типа в папку:

f_folders = { "typeA" : "nas/folder/A", 
              "typeB" : "nas/folder/B", 
              "typeC" : "nas/folder/C" }

Определите функцию для сопоставления:

def match_name(class_d, name, default="typeX"):
    for c,r in f_matcher.items():
        if r.match(name):
            return c
    return default

А затем, в вашем цикле, извлеките ваше имя файла и используйте subloop или def для выполнения тегов - и сопоставьте это с вашим предопределенным списком путей:

f_type = match_name(f_matcher, filename)
new_path = f_folders.get(f_type, "/nas/default/")

Наконец, используйте os.path.split и os.path.join для восстановления имен файлов, которые вы хотите для своих файлов, а затем либо создайте вызов os, чтобы переместить их с помощью команд os, либо с помощью используемого метода здесь .

...