监控文件夹新增XLSX自动转CSV脚本仅首次转换成功问题求解
问题成因
- 时间戳仅全局初始化一次:
timestr变量在程序启动时就生成了固定值,后续所有转换任务生成的CSV文件名完全一致,新文件会直接覆盖旧文件,看起来像没有触发转换逻辑。 - 新增文件判断逻辑不合理:仅通过文件夹总大小增长判断是否有新文件,若出现新增小文件同时删除旧文件、一次性新增多个文件的场景,要么会漏触发转换,要么只会处理最新的一个文件,还可能在文件未完全写入磁盘时就开始读取,导致转换失败。
- 路径硬编码冗余:输入路径在代码中多处硬编码,修改时容易出现路径不匹配的问题。
修复方案
调整逻辑如下:
- 将时间戳生成逻辑移入转换函数内部,每次转换生成新的时间戳,同时追加原文件名前缀,避免同一秒生成的多个文件相互覆盖。
- 替换文件夹大小判断逻辑,改为记录已经处理过的文件列表,每次轮询对比差异,仅处理新增的未处理文件,支持单次处理多个新增文件。
- 增加文件占用校验逻辑,确保文件完全写入磁盘后再执行转换,避免读取到损坏的半写入文件。
- 统一路径配置变量,避免硬编码不一致的问题。
修复后完整代码
import glob import time import os import pandas as pd # 统一配置路径 INPUT_FILEPATH = 'C:/Documents/InputFile' OUTPUT_FILEPATH = 'C:/Documents/OutputFile' # 初始化已处理文件集合 processed_files = set() def format_csv(file_path): # 每次转换生成新的时间戳 timestr = time.strftime("%Y%m%d_%H%M%S") # 提取原文件名前缀,避免同一秒多个文件覆盖 base_name = os.path.splitext(os.path.basename(file_path))[0] output_name = f"{base_name}_{timestr}.csv" full_output_path = os.path.join(OUTPUT_FILEPATH, output_name) # 等待文件写入完成,避免读取未复制完成的损坏文件 while True: try: with open(file_path, 'rb') as f: break except PermissionError: time.sleep(1) read_Excelfile = pd.read_excel(file_path) read_Excelfile.to_csv(full_output_path, index=None, header=True) print(f"转换完成:{file_path} -> {full_output_path}") if __name__ == "__main__": # 首次启动记录存量文件,避免启动时批量转换历史文件,不需要可删除本段 initial_files = set(glob.glob(os.path.join(INPUT_FILEPATH, '*.xlsx'))) processed_files.update(initial_files) while True: # 获取当前目录下所有xlsx文件 current_files = set(glob.glob(os.path.join(INPUT_FILEPATH, '*.xlsx'))) # 筛选新增未处理的文件 new_files = current_files - processed_files for file in new_files: format_csv(file) processed_files.add(file) time.sleep(15)
内容的提问来源于stack exchange,提问作者BabyFly
相关产品推荐
相关产品推荐

