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}")
重要注意事项
- 务必修改日期提取逻辑:上面的日期提取示例是通用写法,你需要根据自己的文件名格式(比如
20231005_data.csv、data_2023-10-05.csv等)调整代码,否则提取的日期会不正确。 - 先备份文件再测试:批量修改文件前,建议先复制几个文件做测试,避免覆盖原文件导致数据丢失。
内容的提问来源于stack exchange,提问作者Seju89
相关产品推荐
相关产品推荐

