You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

监控文件夹新增XLSX自动转CSV脚本仅首次转换成功问题求解

问题成因

  • 时间戳仅全局初始化一次:timestr 变量在程序启动时就生成了固定值,后续所有转换任务生成的CSV文件名完全一致,新文件会直接覆盖旧文件,看起来像没有触发转换逻辑。
  • 新增文件判断逻辑不合理:仅通过文件夹总大小增长判断是否有新文件,若出现新增小文件同时删除旧文件、一次性新增多个文件的场景,要么会漏触发转换,要么只会处理最新的一个文件,还可能在文件未完全写入磁盘时就开始读取,导致转换失败。
  • 路径硬编码冗余:输入路径在代码中多处硬编码,修改时容易出现路径不匹配的问题。

修复方案

调整逻辑如下:

  1. 将时间戳生成逻辑移入转换函数内部,每次转换生成新的时间戳,同时追加原文件名前缀,避免同一秒生成的多个文件相互覆盖。
  2. 替换文件夹大小判断逻辑,改为记录已经处理过的文件列表,每次轮询对比差异,仅处理新增的未处理文件,支持单次处理多个新增文件。
  3. 增加文件占用校验逻辑,确保文件完全写入磁盘后再执行转换,避免读取到损坏的半写入文件。
  4. 统一路径配置变量,避免硬编码不一致的问题。

修复后完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:45:02