如何根据文件名称的一部分将文件移动到文件夹中?

时间:2019-07-09 13:39:17

标签: python file etl move

我有一堆文件是从服务器下载的,我已经在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)

理想情况下,我的文件将从下载的文件进入我创建的目录,该目录会指向一个文件夹,其中每个A,B,C等不同的数据域都有10个文件夹。

1 个答案:

答案 0 :(得分:0)

我很想先构建一个正则表达式字典,您可以用它来对文件名进行分类:

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

然后,在循环中,提取文件名,并使用子循环或def执行标记-并将其映射到预定义的路径列表:

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

最后,利用os.path.splitos.path.join来重建文件所需的文件名,然后构造一个os调用以使用os-commands或使用某种技术来移动它们受雇于here