Python如何为目录下CSV添加文件名前8位列并正确保存
问题说明
- 需求场景:指定文件夹下存放多个CSV文件,需要为每个CSV新增1列,列值为对应文件名的前8个字符,修改完成后覆盖保存到原文件
- 故障现象:现有代码运行后打印输出的结果符合预期,但修改内容没有实际写入到原CSV文件中
原有实现代码:
from tkinter.messagebox import YES import pandas as pd import glob, os import fnmatch import os files = glob.glob(r'path\*.csv') for fp in files: df = pd.concat([pd.read_csv(fp).assign(date=os.path.basename(fp).split('.')[0][:8])]) #for i in df('date'): #Decoder problem print(df)
故障原因
- 核心问题:代码仅完成了CSV读取、列新增的内存操作,没有调用DataFrame的写入方法,所有修改不会自动同步到磁盘文件
- 冗余逻辑:
- 存在未使用的无效导入:
tkinter.messagebox.YES、fnmatch,且重复导入了os模块 - 用
pd.concat包裹单个DataFrame属于无意义操作,不会产生任何实际效果 - 循环内每次迭代都会重新给
df变量赋值,循环结束后df仅保留最后一个读取的文件内容,之前处理的文件对象全部被覆盖丢弃
- 存在未使用的无效导入:
修复方案
直接在循环内完成读取、列新增、写入覆盖全流程即可,参考实现代码:
import pandas as pd import glob import os # 替换为你存放CSV文件的实际文件夹路径 files = glob.glob(r'实际文件夹路径\*.csv') for fp in files: # 读取当前CSV文件 df = pd.read_csv(fp) # 截取文件名前8位作为新列值 file_prefix = os.path.basename(fp).split('.')[0][:8] df['date'] = file_prefix # 覆盖写入原文件,index=False表示不写入pandas自动生成的行索引列 df.to_csv(fp, index=False, encoding='utf-8-sig') print(f"处理完成:{os.path.basename(fp)}")
注意事项
- 首次运行前建议先备份原CSV文件,避免逻辑错误导致原始数据丢失
- 如果你的CSV文件使用特定编码,可以调整
to_csv方法的encoding参数,例如使用GBK编码的文件可设置为encoding='gbk' - 即使文件名包含多个
.分隔符(例如20240601.sales.v2.csv),split('.')[0]依然可以准确取到主文件名部分,不影响前8位字符截取
内容的提问来源于stack exchange,提问作者Anthony Admin
相关产品推荐
相关产品推荐

