1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | import os import shutil import re import csv from datetime import datetime # 定義主分類和子分類規則 categories = { "行政與財務": { "正則": r".*(行政|捐款|禁伐補償|發票|營業稅|營所稅|出納|財務|董事會).*|.*稅務.*|.*報表.*", "子分類": { "行政相關": r".*(行政|會議記錄|年度計畫).*", "捐款收據": r".*(捐款|收據).*", "禁伐補償": r".*(禁伐|補償|森林).*", "發票": r".*(發票|付款憑證).*", "營業稅、營所稅": r".*(營業稅|營所稅|稅務申報).*", "出納": r".*(出納|現金帳|支出明細).*" } }, "地段": { "正則": r".*(地段|契約|土地謄本|巡視照片|點交|法拍|法院文件).*|.*地圖.*", "子分類": { "契約": r".*(契約|合約).*", "土地謄本": r".*(土地謄本|地權資料).*", "點交照片": r".*(點交|交接記錄|法院文件).*", "巡視照片": r".*(巡視|現場照片).*", "法拍資料": r".*(法拍|拍賣).*" } }, "會務": { "正則": r".*(會務|網站備份|行政出納|董事會|活動紀錄|標案|補助|暑期工讀|暑期實習|公文掃描).*|.*活動.*|.*會議.*", "子分類": { "行政出納": r".*(行政出納|專案支出).*", "網站備份": r".*(網站備份|網站資料).*", "董事會": r".*(董事會|會議議程).*", "活動紀錄": r".*(活動紀錄|照片).*", "標案與補助": r".*(標案|補助|專案).*", "暑期實習與工讀": r".*(暑期實習|工讀).*", "公文掃描": r".*(公文|掃描).*" } }, "多媒體文件": { "正則": r".*\.(jpg|jpeg|png|gif|bmp|mp4|mkv|avi|mov|pdf).*|.*多媒體.*|.*影像.*|.*掃描.*", "子分類": {} }, "未分類": { "正則": r".*(未分類|雜).*|.*未知.*", "子分類": {} } } # 已處理的檔案和資料夾 processed_paths = set() # 源目錄和目標目錄 source_dir = r"C:\Users\xxxx\Desktop\新增資料夾" target_dir = r"C:\Users\xxxx\Desktop\分類後" # 移動報告文件 report_file = os.path.join(target_dir, f"分類移動報告_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv") report_data = [] # 建立分類結構 def create_folder_structure(): for main_category, details in categories.items(): main_path = os.path.join(target_dir, main_category) os.makedirs(main_path, exist_ok=True) for sub_category in details["子分類"].keys(): os.makedirs(os.path.join(main_path, sub_category), exist_ok=True) # 分類檔案和資料夾 def classify_files_and_folders(): for root, dirs, files in os.walk(source_dir): for name in dirs + files: path = os.path.join(root, name) if path not in processed_paths: move_to_category(path, name, is_folder=os.path.isdir(path)) # 根據規則分類 def move_to_category(path, name, is_folder): for main_category, details in categories.items(): if re.match(details["正則"], name, flags=re.IGNORECASE): for sub_category, sub_pattern in details["子分類"].items(): if re.match(sub_pattern, name, flags=re.IGNORECASE): sub_dir = os.path.join(target_dir, main_category, sub_category) move_to_destination(path, sub_dir, name, is_folder) processed_paths.add(path) return main_dir = os.path.join(target_dir, main_category) move_to_destination(path, main_dir, name, is_folder) processed_paths.add(path) return unclassified_dir = os.path.join(target_dir, "未分類") move_to_destination(path, unclassified_dir, name, is_folder) processed_paths.add(path) # 移動並記錄 def move_to_destination(source_path, dest_dir, name, is_folder): os.makedirs(dest_dir, exist_ok=True) target_path = os.path.join(dest_dir, name) if is_folder: if not os.path.exists(target_path): shutil.move(source_path, target_path) else: shutil.move(source_path, target_path) report_data.append([source_path, target_path, "資料夾" if is_folder else "檔案"]) # 生成報告 def generate_report(): with open(report_file, mode="w", newline="", encoding="utf-8") as file: writer = csv.writer(file) writer.writerow(["來源路徑", "目標路徑", "類型"]) writer.writerows(report_data) print(f"報告生成:{report_file}") # 執行 if __name__ == "__main__": create_folder_structure() classify_files_and_folders() generate_report() print("分類完成!") |
Direct link: https://paste.plurk.com/show/6jmkvASbvVh8lAf3mMi1