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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 22:16:01