每次更新后将DataFrame数据追加保存至CSV而非覆盖的实现方法
如何在Pandas中追加数据到CSV文件而不覆盖历史数据
问题描述
从服务器获取Entry、Middle、Exit格式的数据,希望每次更新后将数据存入DataFrame并追加保存到abc.csv文件中,但当前代码运行时总是覆盖原有历史数据,即使循环执行5次,CSV文件中也仅保留最后一条数据。
原代码如下:
df = pd.DataFrame(columns=['Entry','Middle','Exit']) def function(): entry_value = 178.184 # data comming from server middle_value = 14.121 # data comming from server exit_value = 19.21 # data comming from server df1 = df.append({'Entry' : entry_value , 'Middle' : middle_value, 'Exit' : exit_value}, ignore_index = True) df1.to_csv('abc.csv') i = 0 while i < 5: function() i += 1
注:示例中数据为硬编码,实际数据来自服务器,格式一致。
问题原因
- 每次调用
function()时,都是基于初始空DataFramedf进行append,生成的df1始终只有1条数据,写入时直接覆盖之前的文件内容。 to_csv()默认使用mode='w'(写入模式),会直接清空原有文件后写入新内容。
解决方案
方案1:直接追加单条数据到CSV(推荐)
将单条数据转为小型DataFrame,使用mode='a'追加到文件,同时处理表头重复问题:
import pandas as pd import os def function(): entry_value = 178.184 # 实际数据来自服务器 middle_value = 14.121 exit_value = 19.21 # 把单条数据转为DataFrame格式 new_row = pd.DataFrame({'Entry': [entry_value], 'Middle': [middle_value], 'Exit': [exit_value]}) # 判断文件是否存在,决定是否写入表头 need_header = not os.path.exists('abc.csv') # 追加模式写入CSV,不写入索引列 new_row.to_csv('abc.csv', mode='a', index=False, header=need_header) i = 0 while i < 5: function() i += 1
方案2:维护全局DataFrame保存全量数据
如果需要在内存中保留所有历史数据,可以初始化时读取已有文件(如果存在),每次追加新数据后覆盖写入全量数据:
import pandas as pd import os # 初始化DataFrame:文件存在就读取历史数据,不存在则创建空表 if os.path.exists('abc.csv'): df = pd.read_csv('abc.csv') else: df = pd.DataFrame(columns=['Entry','Middle','Exit']) def function(): global df entry_value = 178.184 # 实际数据来自服务器 middle_value = 14.121 exit_value = 19.21 # 追加新数据到全局DataFrame df = df.append({'Entry': entry_value, 'Middle': middle_value, 'Exit': exit_value}, ignore_index=True) # 写入全量数据到CSV df.to_csv('abc.csv', index=False) i = 0 while i < 5: function() i += 1
关键参数说明
mode='a':将文件打开模式设为追加,新数据会添加到文件末尾而非覆盖原有内容。header=need_header:通过判断文件是否存在,确保只有第一次写入时添加表头,避免重复生成表头行。index=False:禁止将DataFrame的索引列写入CSV,保持数据格式整洁。
内容的提问来源于stack exchange,提问作者khan
相关产品推荐
相关产品推荐

