[英]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.split
和os.path.join
重建文件所需的文件名,然后構造一個os調用以使用os-commands或此處采用的某種技術來移動它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.