根据关键词对文件进行分类

2023-03-17 21:42 | 人气:48
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('程序执行完毕')


收起
展开