import os
import shutil
import tkinter as tk
from tkinter import filedialog
# 获取待处理文件夹路径
def get_input_dir():
root = tk.Tk()
root.withdraw()
input_dir_path = filedialog.askdirectory(title="请选择待处理文件夹")
return input_dir_path
# 获取处理完成后的文件夹路径
def get_output_dir():
root = tk.Tk()
root.withdraw()
output_dir_path = filedialog.askdirectory(title="请选择保存结果的文件夹")
return output_dir_path
# 获取关键词文件路径,并返回一个包含所有关键词的列表
def get_keywords():
root = tk.Tk()
root.withdraw()
keyword_file_path = filedialog.askopenfilename(title="请选择包含关键词的文件", filetypes=[("Text Files", "*.txt")])
with open(keyword_file_path, 'r', encoding='utf-8') as f:
keywords_list = f.read().splitlines()
return keywords_list
# 将符合要求的文件移动至目标文件夹
def move_files(file_paths, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for file_path in file_paths:
try:
shutil.move(file_path, output_dir)
print('已将%s移动至%s' % (file_path.split('\\')[-1], output_dir))
logging.info('已将%s移动至%s' % (file_path.split('\\')[-1], output_dir))
except OSError:
# 处理重名等异常情况
new_file_name = os.path.splitext(os.path.basename(file_path))[0] + '_moved' + os.path.splitext(os.path.basename(file_path))[1]
shutil.move(file_path, os.path.join(output_dir, new_file_name))
print('由于存在同名文件,%s已被重命名并移动至%s' % (file_path.split('\\')[-1], output_dir))
logging.warning('由于存在同名文件,%s已被重命名并移动至%s' % (file_path.split('\\')[-1], output_dir))
# 根据关键词和文件名进行分词理解、匹配。
def classify_files(input_dir, keywords, output_dir, log_file_path):
# 符合条件的文件列表
eligible_files = []
# 遍历待处理文件夹内所有文件
for root, dirs, files in os.walk(input_dir):
for file in files:
# 对文件名进行简单处理:抽取文件名及格式,去除中文、数字以及下划线之外的其他字符
name, ext = os.path.splitext(file)
name = ''.join(filter(str.isalpha, name + '_')).strip('_')
# 判断文件名是否包含任意一个关键词
if any(keyword in name for keyword in keywords):
eligible_files.append(os.path.join(root, file))
if eligible_files:
move_files(eligible_files, output_dir)
else:
print('没有找到符合条件的文件')
logging.info('没有找到符合条件的文件')
if __name__ == '__main__':
# 设置日志记录器
import logging
logging.basicConfig(filename='classify.log', level=logging.INFO,
format='%(asctime)s:%(levelname)s:%(message)s')
logging.info('开始执行程序')
# 弹窗选择待处理文件夹路径
input_dir_path = get_input_dir()
# 弹窗选择保存结果的文件夹路径
output_dir_path = get_output_dir()
# 弹窗选择包含关键词的文件路径,并创建关键词列表
keywords_list = get_keywords()
# 开始分类操作
classify_files(input_dir_path, keywords_list, output_dir_path, 'classify.log')
logging.info('程序执行完毕')