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
模块之外的其他东西。有什么想法吗?
感谢您的帮助,对于冗长的问题,我们深表歉意。
答案 0 :(得分:3)
我认为您需要在发生这种情况时重写整个文件。当前,您正在使用a
打开文件,因此只能在文件末尾添加内容,而不能在文件中间添加内容。我认为没有简单的解决方案可以在文件中间添加内容。
然后最简单的解决方案是将整个文件读入内存,将新列添加到标题行,然后重写整个文件。
有关如何执行此操作的示例,请参见this question。