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

Python批量为200个CSV文件添加文件名列时遇错误求助

问题分析与解决方案:给批量CSV文件新增日期列的错误处理

嘿,我来帮你排查下代码里的问题,你遇到的InvalidFileException错误和仅第一个文件成功的情况,其实是几个明确的逻辑和工具使用错误导致的,咱们一步步拆解:

核心错误点解析

1. 用错工具:openpyxl不能处理CSV文件

openpyxl是专门用来读写Excel的.xlsx/.xlsm这类格式的,这些格式本质是压缩包结构。你用它加载纯文本的CSV文件,它会误以为这是损坏的zip文件,直接抛出InvalidFileException: File is not a zip file错误。而且这段代码完全是多余的——CSV文件处理完直接保存就行,不需要用openpyxl再操作一遍,删掉这部分就解决了主要报错。

2. 循环逻辑漏洞:未提前过滤非CSV文件

os.listdir会返回目录里的所有文件和文件夹,你只在处理完文件后才判断是否是CSV,但前面已经用csv模块尝试处理非CSV文件了,这会导致循环中途报错中断,所以只有第一个CSV文件能成功处理。应该在循环开始就只筛选.csv结尾的文件。

3. 冗余且错误的pandas代码

你最后那段pandas代码逻辑完全混乱:

  • csv_filename = pd.read_csv(r'\\\\\\')会把路径对应的文件读成DataFrame,
  • 然后你又把这个DataFrame传给pd.read_csv(csv_filename),这肯定会报错,
  • 而且这部分和前面的循环重复,完全没必要,直接删掉即可。

4. 需求偏差:未提取文件名中的日期

当前代码是把整个文件名加到列里,但你的需求是提取文件名中的日期信息,所以需要加一步解析文件名的操作。


修正后的代码(两种方案可选)

方案1:用原生csv模块(适合不想依赖pandas的场景)

import os
import csv
# 可选:如果需要正则提取日期,导入re模块
# import re

# 替换成你的目标目录路径
target_dir = r'\\\\\\\\'
os.chdir(target_dir)

# 遍历目录下所有CSV文件
for file_name in os.listdir(target_dir):
    if not file_name.endswith('.csv'):
        continue  # 跳过非CSV文件
    
    # --------------------------
    # 重点:根据你的实际文件名格式提取日期
    # 示例1:文件名格式如"sales_20231005.csv",用分割提取
    # date_part = file_name.split('_')[1].replace('.csv', '')
    # 示例2:用正则匹配8位数字日期(如20231005)
    # date_part = re.findall(r'\d{8}', file_name)[0]
    # 示例3:如果日期是文件名前缀,比如"2023-10-05_report.csv"
    # date_part = file_name.split('_')[0]
    # --------------------------
    # 这里先写一个通用示例,请根据你的实际情况修改!
    date_part = file_name.split('.')[0]
    
    # 读取并修改CSV内容
    with open(file_name, 'r', newline='') as csvinput:
        reader = csv.reader(csvinput)
        all_rows = []
        # 处理表头,新增日期列
        header = next(reader)
        header.append('文件日期')
        all_rows.append(header)
        
        # 给每一行添加日期信息
        for row in reader:
            row.append(date_part)
            all_rows.append(row)
    
    # 写回原文件(注意newline=''避免Windows下出现空行)
    with open(file_name, 'w', newline='') as csvoutput:
        writer = csv.writer(csvoutput, lineterminator='\n')
        writer.writerows(all_rows)
    
    print(f"已完成处理:{file_name}")

方案2:用pandas(代码更简洁,批量处理更高效)

Python3.4支持pandas 0.25.x版本,如果你还没安装,可以用pip install pandas==0.25.3安装。

import pandas as pd
import os
import re

target_dir = r'\\\\\\\\'
os.chdir(target_dir)

for file_name in os.listdir(target_dir):
    if not file_name.endswith('.csv'):
        continue
    
    # 提取日期(同样,请根据你的文件名格式调整)
    date_match = re.search(r'\d{4}-\d{2}-\d{2}', file_name)  # 匹配YYYY-MM-DD格式
    if date_match:
        date_part = date_match.group()
    else:
        # 如果没匹配到日期,用文件名作为 fallback,或者跳过该文件
        date_part = file_name.split('.')[0]
    
    # 读取CSV、新增列、保存
    df = pd.read_csv(file_name)
    df['文件日期'] = date_part
    df.to_csv(file_name, index=False)  # index=False避免写入多余的索引列
    
    print(f"处理完成:{file_name}")

重要注意事项

  1. 务必修改日期提取逻辑:上面的日期提取示例是通用写法,你需要根据自己的文件名格式(比如20231005_data.csv、data_2023-10-05.csv等)调整代码,否则提取的日期会不正确。
  2. 先备份文件再测试:批量修改文件前,建议先复制几个文件做测试,避免覆盖原文件导致数据丢失。

内容的提问来源于stack exchange,提问作者Seju89

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:17:45