Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:动态增长的CSV 我正在使用标准库中的CSV模块逐块构建CSV。_Python_Python 3.x_Csv - Fatal编程技术网

Python:动态增长的CSV 我正在使用标准库中的CSV模块逐块构建CSV。

Python:动态增长的CSV 我正在使用标准库中的CSV模块逐块构建CSV。,python,python-3.x,csv,Python,Python 3.x,Csv,这意味着我正在循环中逐个添加行。我添加的每一行都包含数据帧中每一列的信息 所以,我有一个CSV: A B C D 我将一行一行地添加: A B C D aaaaa bbb ccccc ddddd a1a1a b1b1 c1c1c1 d1d1d1 a2a2a b2b2 c2c2c2 d2d2d2 等等 我的问题是,有时,我添加的行包含更多信息(即,没有列的信息)。例如: A

这意味着我正在循环中逐个添加行。我添加的每一行都包含数据帧中每一列的信息

所以,我有一个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增长(在运行时)? (使用“grow”我的意思是添加“额外”列)

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

    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
模块、带有
语句的
和字典添加行:

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']
    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
注意:从这个例子看来,我现在已经知道将添加
E
,但事实并非如此。我这样展示只是为了举例。我不知道“额外”数据是什么,直到我得到“额外”行(这是我在一段时间内从web srap获得的)

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

fields = writer.__getattribute__('fieldnames')
writer.fieldnames = fields + ['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是为加载完全填充的数据帧而设计的,但如果您建议,我愿意使用
csv
模块之外的其他功能。有什么想法吗


谢谢你的帮助,很抱歉问了这么长的问题,我尽量说清楚。

我想你需要重写整个文件。目前,您正在使用 A<代码>打开文件,因此只能在末尾追加内容,而不要在文件中间添加一些内容。我不认为在文件中间添加一些简单的解决方案。

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


请参阅如何执行此操作的示例。

在打开文件之前,您是否知道一些东西,因此您可以从一开始就将其写入标题和行中,通常为空字符串或无字符串,有时仅为某个值?那么我想没有图书馆会抱怨这个文件。@SpghttCd不,我从一开始就不知道E。我只是举个例子来说明。我每一行都是从我正在做的网页抓取中得到的。为什么你知道B C D而不知道E。。。?然而,这是徒劳的,只要你没有变得更具体。但是,如果所有这些都如您所描述的那样,csv逐行不是适合您的方式。在csv中,所有行必须包含与标题相同数量的分隔符。否则,您将无法使用支持csv的库读取它。@SpghttCd,因为我是从一个web片段获取信息的。我的问题是我把CSV当作一个非关系数据库来处理,其中表可以水平增长。然后你应该考虑使用一个内存数据结构,比如一个NUMPY数组,以便在你的修剪完成后把它写入CSV。否则,您应该使用支持任意维度动态增长的文件格式,如您提到的数据库或netCDF、hdf5,也许我可以想象……问题是,我每秒钟(大约)添加一个新列,到例程结束时,总共将获得约1000列。因此,每次重写整个文件都会非常缓慢和低效。那么,不是最好不要一直将所有内容写入文件,而是将其建立在内存中,只在需要实际存储时才将其写入文件吗?是的,这就是我要做的,谢谢!我会接受你的回答。酷,我很高兴能帮上忙!