【发布时间】: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:动态增长的 CSV - Python技术站