Python:将字典追加到现有的csv

时间:2019-07-25 16:42:53

标签: python pandas csv

我想将字典数据附加到现有的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文件中。

2 个答案:

答案 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']])