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("分類完成!")