Python:动态增长CSV

2024-09-25 18:25:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用标准库中的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

My question is: Is there any way to make the CSV grow (during runtime) when that happens? (with 'grow' I mean to add the "extra" columns)

所以基本上我希望这样:

    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'

在添加行之前,我尝试将“extra”字段名添加到csv中,如下所示:

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

注意:从这个例子看来,我已经添加了E,但事实并非如此。我只是举个例子。我不知道“额外”数据将是什么,直到我得到“额外”行(这是我在一段时间内从一个websrap获得的)。你知道吗

它成功地避开了异常,但没有添加额外的列,因此我最终得到如下结果:

    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是为加载完全填充的数据帧而设计的,但是如果您建议的话,我愿意使用csv模块之外的其他东西。有什么想法吗?你知道吗

谢谢你的帮助,很抱歉问了这么长时间,我尽量说清楚。你知道吗


Tags: csvthewriterbbbaaaaadddddcccccb2b2
1条回答
网友
1楼 · 发布于 2024-09-25 18:25:03

我想你需要重写整个文件。当前您正在用a打开文件,因此只能在文件末尾添加内容,而不能在文件中间添加内容。我不认为有一个简单的解决方案,添加一些东西在一个文件的中间。你知道吗

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

请参见this question以获取有关如何做到这一点的示例。你知道吗

相关问题 更多 >