Python:动态增长的CSV

时间:2018-07-24 18:00:40

标签: python python-3.x csv

我正在使用标准库中的csv模块逐块构建CSV。

这意味着我正在循环地逐行添加行。我添加的每一行都包含有关数据框每一列的信息。

所以,我有这个CSV:

A     B      C     D

我要一行一行地添加:

    A       B      C      D
  aaaaa   bbb    ccccc   ddddd
  a1a1a   b1b1   c1c1c1  d1d1d1
  a2a2a   b2b2   c2c2c2  d2d2d2

以此类推。

我的问题是,有时候,我要添加的行包含更多信息(即,没有列的信息)。例如:

    A       B      C      D
  aaaaa   bbb    ccccc   ddddd
  a1a1a   b1b1   c1c1c1  d1d1d1
  a2a2a   b2b2   c2c2c2  d2d2d2
  a3a3a   b3b3   c3c3c3  d3d3d3   e3e3e3  #this row has extra information
  

我的问题是:   发生这种情况时,有什么方法可以使CSV增长(在运行时)?   (“增长”是指添加“额外”列)

所以基本上我希望这能发生:

    A       B      C       D        E    # this column was added because 
  aaaaa   bbb    ccccc   ddddd           # of the extra column found
  a1a1a   b1b1   c1c1c1  d1d1d1          # in the new row
  a2a2a   b2b2   c2c2c2  d2d2d2
  a3a3a   b3b3   c3c3c3  d3d3d3   e3e3e3

我正在使用标准库中的csv模块,with语句和字典添加行:

import csv

addThis = {A:'a3a3a', B:'b3b3', C:'c3c3c3', D:'d3d3d3', E:'e3e3e3'}

with open('csvFile', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(addThis)

如您所见,在我要添加的字典中,我指定了新列的名称。当我尝试执行此操作时会发生以下情况:

ValueError: dict contains fields not in fieldnames: 'E'

在添加这样的行之前,我曾尝试将{ex1“字段名添加到csv

fields = writer.__getattribute__('fieldnames')
writer.fieldnames = fields + ['E']

注意:从此示例看来,我现在已经添加了E,但事实并非如此。我仅以示例的方式显示了它。我不知道“额外”数据是什么,直到我得到“额外”行(我从网络废话中获得了一段时间)。

设法逃避了异常,但是没有添加额外的列,所以我最终得到了这样的东西:

    A       B      C       D
  aaaaa   bbb    ccccc   ddddd
  a1a1a   b1b1   c1c1c1  d1d1d1
  a2a2a   b2b2   c2c2c2  d2d2d2
  a3a3a   b3b3   c3c3c3  d3d3d3   e3e3e3   # value is added but the column
                                           # name is not there

我不使用Pandas,因为我了解Pandas旨在加载完全填充的DataFrame,但是如果您建议,我可以使用csv模块之外的其他东西。有什么想法吗?

感谢您的帮助,对于冗长的问题,我们深表歉意。

1 个答案:

答案 0 :(得分:3)

我认为您需要在发生这种情况时重写整个文件。当前,您正在使用a打开文件,因此只能在文件末尾添加内容,而不能在文件中间添加内容。我认为没有简单的解决方案可以在文件中间添加内容。

然后最简单的解决方案是将整个文件读入内存,将新列添加到标题行,然后重写整个文件。

有关如何执行此操作的示例,请参见this question