如何使用Python和Pandas将多列表按列写入CSV文件并实现迭代追加不覆盖,同时解决EmptyDataError报错
解决CSV列追加数据的EmptyDataError问题
错误原因分析
你遇到的pandas.errors.EmptyDataError完全是因为代码顺序搞反了:你先尝试把空的DataFrame写入CSV,之后才给DataFrame赋值。如果是第一次运行,目标文件根本不存在,pandas找不到任何可解析的列结构,直接抛出这个错误。
正确实现方案
我们需要先把每次迭代的新数据转换成DataFrame,再根据文件是否存在来决定是创建新文件(带表头)还是追加数据(不带表头)。完整代码如下:
import pandas as pd import os # ---------------------- # 第一步:准备本次迭代的新数据 # ---------------------- # 第一次迭代的初始数据 titles = ['title1', 'title2', 'title3'] emails = ['1@1', '1@2', '1@3'] links = ['http1', 'http2', 'http3'] # 后续迭代的新数据(替换上面的初始数据即可) # titles = ['title4', 'title5', 'title6'] # emails = ['1@4', '1@5', '1@6'] # links = ['http4', 'http5', 'http6'] # ---------------------- # 第二步:转换为对应列的DataFrame # ---------------------- temp_df = pd.DataFrame({ 'Titles': titles, 'Emails': emails, 'Links': links }) # ---------------------- # 第三步:写入/追加到CSV文件 # ---------------------- file_path = 'content.csv' if not os.path.exists(file_path): # 文件不存在,首次创建:写入表头+完整数据 temp_df.to_csv(file_path, index=False) else: # 文件已存在,追加数据:不写表头,避免重复 temp_df.to_csv(file_path, mode='a', header=False, index=False)
关键细节说明
- 列名一致性:每次创建
temp_df时,必须保证列名(Titles、Emails、Links)和首次创建的完全一致,这样追加的数据才能准确对应到目标列; - 追加模式控制:
mode='a'告诉pandas以追加方式打开文件,而不是默认的覆盖模式; - 表头避免重复:只有首次创建文件时写入表头,后续追加时设置
header=False,防止表头在文件中重复出现。
运行效果
第一次运行后,content.csv内容:
Titles,Emails,Links title1,1@1,http1 title2,1@2,http2 title3,1@3,http3
替换为后续迭代的数据再次运行,文件会追加为:
Titles,Emails,Links title1,1@1,http1 title2,1@2,http2 title3,1@3,http3 title4,1@4,http4 title5,1@5,http5 title6,1@6,http6
内容的提问来源于stack exchange,提问作者Frederico Barbosa
相关产品推荐
相关产品推荐

