我想将字典数据附加到现有的csv中,而无需再次写入标头。
我尝试了以下所有问题:append new row to old csv file python
我尝试了熊猫和CSV解决方案。
try:
if os.path.isfile(csv_filepath) is False:
df = pandas.DataFrame.from_dict(dict_data, orient="index")
df.to_csv(csv_filepath)
else:
list_values = []
list_keys = []
for key, value in dict_data.items():
list_values.append(value)
list_keys.append(key)
with open(csv_filepath, 'a', newline='') as fd:
writer = csv.DictWriter(fd, fieldnames=list_keys)
writer.writerow(dict_data)
except Exception as e:
raise e
我也尝试过
with open(csv_filtepath, 'a') as f:
writer = csv.writer(f)
writer.writerow(dict_data)
但同时擦除和写入新数据而无需附加。
我还尝试将两个csv加载到数据帧中,然后将第二个csv附加到第一个,但是它两次添加了标头
编辑:
例如,我首先使用以下代码创建一个csv:{'toto':1,'tata':2,'titi':3}
然后我要附加创建的csv {'toto':2,'tata':1,'titi':5}
此操作后,我要在toto列中添加1和2,在tata列中添加2和1,在titi列中添加3和5。
编辑2
我尝试过:
df1 = pd.read_csv(csv_filepath)
df2 = pd.DataFrame(dict_data)
df3 = pd.concat([df1, df2], axis=0)
df3.to_csv(csv_filepath)
但是我收到一条错误消息:'错误标记数据。 C错误:第20行中应有2个字段,看到9'
编辑3
list_keys = []
for key, value in dict_data.items():
list_keys.append(key)
with open(csv_filepath, 'a', newline='') as fd:
writer = csv.DictWriter(fd, fieldnames=list_keys)
writer.writerow([data['toto'], data['tata'], data['titi']])
我收到此错误消息:'list'对象没有属性'keys'
我想使用相同的键将字典中的数据添加到现有的csv文件中。
答案 0 :(得分:0)
df1 = pd.DataFrame({'toto': [1], 'tata': [2], 'titi': [3]})
df2 = pd.DataFrame({'toto': [2], 'tata': [1], 'titi': [5]})
DF = pd.concat([df1, df2], axis=0)
这就是您要寻找的
编辑:您的示例的高效内存代码段
filepaths = ['pathtocsvfolder/df1.csv','pathtocsvfolder/df2.csv']
only_head = True
for i in filepaths:
df = pd.read_csv(i)
if only_head:
df.to_csv('final.csv', index=False)
only_head = False
else:
df.to_csv('final.csv', index=False, header=False, mode='a')
答案 1 :(得分:0)
0
方法有效;实际上,它只是为我工作而没有被截断。
请注意,您创建的是open(csv_filtepath, 'a')
,而不是writer
;前者接受列表,而不接受字典。
但是,如果要追加到现有文件,则无论如何都必须显式地遵循其列的顺序,因此DictWriter将无法工作。假设这是您要附加的文件的列顺序,您将必须执行以下操作。
DictWriter
知道列顺序也可能很棘手。如果您不确定,可以例如如果第一个CSV文件的第一行包含列名,则仅读取该行的第一行。您可以使用普通的CSV阅读器:
with open(csv_file, 'a') as f:
writer = vcs.writer(f) # Note: writes lists, not dicts.
for data in rows_to_append: # Maybe your df, or whatever iterable.
writer.writerow([data['toto'], data['tata'], data['titi']])