【问题标题】:Python: Dynamically growing CSVPython:动态增长的 CSV
【发布时间】:2023-04-03 23:41:01
【问题描述】:

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

在添加这样的行之前,我尝试将“额外”字段名添加到 csv

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

注意:从这个例子看来,我现在已经添加了E,但事实并非如此。我只是为了这个例子展示了它。在获得“额外”行之前,我不知道“额外”数据是什么(我在一段时间内从网络scrape获得)。

这设法避免了异常,但没有添加额外的列,所以我最终得到了这样的结果:

    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 模块之外的其他东西。有什么想法吗?

感谢您的帮助,抱歉问题太长了,我尽量说得清楚。

【问题讨论】:

  • 在打开文件之前你不知道 E sth,所以你可以在标题和行中从头开始写,通常为空字符串或 None,有时只有某个值?那么我认为没有图书馆会抱怨这个文件。
  • @SpghttCd 不,我从一开始就不知道 E。我只是为了这个例子展示了它。我从正在进行的网络抓取中获取每一行。
  • 为什么你知道 A B C D 但不知道 E...?然而,只要你没有变得更具体,这是徒劳的。但是,如果这一切都如您所描述的那样,那么 csv 逐行不是您的最佳选择。在 csv 中,所有行必须包含与标题相同数量的分隔符。否则,您将无法使用支持 csv 的库来读取它。
  • @SpghttCd 因为我是从网络垃圾中获取信息的。我的问题是我将 CSV 视为非关系数据库,其中表可以水平增长。
  • 那么您应该考虑使用内存中的数据结构,例如一个 numpy 数组,以便在完成抓取后将其写入 csv。否则,您应该使用支持任意维度动态增长的文件格式,例如您自己提到的数据库或 netCDF、hdf5,也许是我可以想象的垫子……

标签:
python
python-3.x
csv