Pandas导出DataFrame到CSV时避免覆盖原有文件实现数据累加的方法
Pandas导出CSV实现数据追加不覆盖的解决方法
你现在用的默认导出是覆盖模式,只要修改to_csv的参数或增加简单的存在性判断即可实现累加效果,两种常用方案如下:
方案1:追加写入模式(性能最优,适合大数据量场景)
pandas.DataFrame.to_csv自带追加写入参数,只需判断文件是否存在来控制是否写入表头即可:
- 新增
mode='a'参数:将默认的覆盖写入模式改为追加写入模式 - 仅首次写入时保留
header=True,后续追加时设为header=False,避免重复生成表头行 - 可选增加
encoding='utf-8-sig'参数避免中文乱码
示例代码:
import os save_path = r'C:\Users\StageProject\Indicateurs\indStat.csv' if os.path.exists(save_path): # 文件已存在,追加写入不写表头 dfind.to_csv(save_path, index=True, header=False, mode='a', encoding='utf-8-sig') else: # 文件不存在,首次写入带表头 dfind.to_csv(save_path, index=True, header=True, encoding='utf-8-sig')
方案2:拼接新旧数据后写入(适合需去重的场景)
如果追加时需要对重复数据做过滤,可以先读取旧文件和新数据拼接后再全量写入:
import os import pandas as pd save_path = r'C:\Users\StageProject\Indicateurs\indStat.csv' if os.path.exists(save_path): # 读取原有数据,index_col=0对应你原配置的导出索引 old_df = pd.read_csv(save_path, index_col=0) # 拼接数据,可通过drop_duplicates指定列去重,无需去重则删掉该方法即可 total_df = pd.concat([old_df, dfind]).drop_duplicates(keep='last') total_df.to_csv(save_path, index=True, header=True, encoding='utf-8-sig') else: dfind.to_csv(save_path, index=True, header=True, encoding='utf-8-sig')
注意事项
- 使用追加模式前需保证待写入的
dfind的列名、列顺序和旧CSV文件完全一致,否则会出现列错位问题 - 单文件体积超过1G时更推荐用方案1,避免读大文件带来的性能损耗
内容的提问来源于stack exchange,提问作者Nabil Kl
相关产品推荐
相关产品推荐

