Python实现列表与字典数据写入CSV:解决内容覆盖及列表项作为首列问题
解决CSV写入覆盖与列表项作为第一列的问题
嘿,刚好碰到过类似的情况,我来帮你搞定这两个问题!
问题原因分析
- 写入覆盖问题:你当前的循环里每次都调用
df.to_csv('test.csv', index=False),而to_csv默认使用mode='w'(写入模式),每次都会清空文件然后写入新内容,所以最后只会剩下最后一次循环的结果。 - 列表项作为第一列:你的代码里没有把
li的值加入到DataFrame中,自然不会出现在CSV的第一列里。
推荐解决方案:一次性收集数据再写入
这种方法更简洁高效,先把所有需要的数据都收集到列表里,再统一转成DataFrame写入CSV,完美避免覆盖问题,同时轻松把列表项作为第一列:
import pandas as pd import random def CreateDict(li): # 直接把ListItem和生成的x、y整合到同一个字典里 return { 'ListItem': li, 'x': random.randrange(1, li), 'y': random.randrange(1, li) } mylist = [10, 20, 30] # 用列表推导式收集所有数据 data_list = [CreateDict(li) for li in mylist] # 转换为DataFrame df = pd.DataFrame(data_list) # 一次性写入CSV,自动生成表头 df.to_csv('test.csv', index=False)
另一种方案:循环追加写入(适合数据量大的场景)
如果你因为数据量太大不想一次性加载,也可以用追加模式,但是要注意只在第一次写入时添加表头:
import pandas as pd import random def CreateDict(li): return { 'x': random.randrange(1, li), 'y': random.randrange(1, li) } mylist = [10, 20, 30] for idx, li in enumerate(mylist): mydict = CreateDict(li) # 把ListItem加入到数据字典中 current_data = {'ListItem': li, **mydict} df = pd.DataFrame([current_data]) # 第一次写入带表头,之后追加不带表头 if idx == 0: df.to_csv('test.csv', index=False) else: df.to_csv('test.csv', index=False, mode='a', header=False)
最终CSV输出示例
不管用哪种方法,生成的CSV都会是你想要的结构:
ListItem,x,y 10,7,4 20,15,9 30,21,27
内容的提问来源于stack exchange,提问作者Flodude
相关产品推荐
相关产品推荐

