簡體   English   中英

如何根據文件名稱的一部分將文件移動到文件夾中?

[英]How do I move files into folders based on a part of their name?

我有一堆文件是從服務器下載的,我已經在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個文件夾。

我很想先構造一個正則表達式字典,您可以用它來對文件名進行分類:

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或此處采用的某種技術來移動它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM