【问题标题】:Python: append dict to existing csvPython:将dict附加到现有的csv
【发布时间】:2019-07-25 16:42:53
【问题描述】:

我想将字典数据附加到现有的 csv 中,而无需再次写入标题。

我尝试了这个问题的所有东西:append new row to old csv file python

我尝试了 pandas 和 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:{'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' object has no attribute 'keys'

我想将具有相同键的字典中的数据添加到现有的 csv 文件中。

【问题讨论】:

  • 提供要使用的数据......以及你得到的输出......以及你想要的输出
  • 感谢@geekzeus 的回答,我刚刚编辑了我的问题
  • open(csv_filtepath, 'a') 方法有效;事实上,它只是为我工作而没有截断。请注意,您创建的是writer,而不是DictWriter;前者接受列表,而不是字典。但是,如果要附加到现有文件,则无论如何都必须明确遵循其列顺序,因此 DictWriter 将不起作用。您必须执行类似.writerow([data['toto'], data['tata'], data['titi']]) 的操作,假设它是您要附加到的文件的列顺序。
  • 谢谢@9000,你能回答一下吗?我现在将根据您的提议尝试编辑我的问题

标签: python pandas csv


【解决方案1】:

open(csv_filtepath, 'a') 方法有效;事实上,它只是为我工作而没有截断。

请注意,您创建的是writer,而不是DictWriter;前者接受列表,而不是字典。

但是,如果您要附加到现有文件,则无论如何都必须明确遵循其列顺序,因此 DictWriter 将不起作用。假设它是您要附加到的文件的列顺序,您将必须执行以下操作。

import csv

with open(csv_file, 'a') as f:
  writer = csv.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']])

了解列顺序也可能很棘手。如果你不确定,你可以例如如果该行包含列名,则仅读取(可能是巨大的)第一个 CSV 文件的第一行。您可以使用普通的 CSV 阅读器:

with open(csv_file) as f:
  reader = csv.reader(f)
  column_names = next(reader)
# Here the file is closed after reading just one line.

【讨论】:

  • 谢谢,但您的回答不完整,您应该添加如何声明作者,然后我会验证您的答案
【解决方案2】:
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)

这就是你要找的东西

编辑:您的示例的高效内存 sn-p

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')       

【讨论】:

  • 这需要将两个部分都读入 RAM;这可能不是很理想。
  • 这不是我真正想要的,因为在我的情况下我想追加。使用你的逻辑我尝试了一些东西,我编辑了我的问题。
  • 试试sep='delimiter', header=None
猜你喜欢
  • 1970-01-01
  • 2021-09-04
  • 2020-12-26
  • 2019-10-20
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2012-09-26
相关资源
最近更新 更多