2010-11-22 48 views
9

使用Python来追加CSV文件,我得到隔行数据。 我该如何解决?如何附加到CSV文件?

import csv 

LL = [(1,2),(3,4)] 

Fn = ("C:\Test.csv") 
w = csv.writer(open(Fn,'a'), dialect='excel') 
w.writerows(LL) 

C:\test.csv当打开这个样子的:

1,2 

3,4 

1,2 

3,4 
+0

什么问题?我不清楚...... – poke 2010-11-22 19:05:36

+0

“我每隔一行都会收到一次数据,我该如何解决?”这是什么意思?你能粘贴样本输出与期望的样本输出吗? – Chris 2010-11-22 19:05:57

+2

@poke,@Chris:OP在每个预期的数据行之后插入一个意外的空行。 – 2010-11-22 20:39:58

回答

34

追加是风马牛不相及的问题;请注意,前两行(来自原始文件的行)也是双倍行距。

真正的问题是,您已经打开文件文本模式。

CSV是一种二进制格式,相信与否。 csv模块正如期望的那样,编写了名为“lineterminator”(应该是“rowseparator”)的\r\n,但随后Windows C运行时会启动并用\r\n替换\n,以便在行之间有\r\r\n。使用Excel的csv文件变得困惑

无论您是否在Windows上运行,都始终以二进制模式('rb','wb','ab')打开您的CSV文件。这样,您将获得预期的rowseparator(CR LF)甚至在* x盒子上,你的代码将是可移植的,并且嵌入在你的数据中的任何换行都不会变成其他东西(写作时)或导致戏剧(在输入时,当然提供它们被引用正确)

Oth呃问题:

(1)不要把你的数据放在你的根目录(C:\)。 Windows在20世纪80年代继承了MS-DOS的分层文件系统。用它。 (2)如果您必须在您的代码中嵌入硬连接的文件名,请使用原始字符串r"c:\test.csv" ...如果您有"c:\test.csv",那么'\ t'将被解释为TAB字符;如果您拥有"c:\test.csv",类似问题\r\n

(3)Python手册中的示例比简洁而不是健壮的代码更加一致。

不要这样做:

w = csv.writer(open('foo.csv', 'wb')) 

这样做:

f = open('foo.csv', 'wb') 
w = csv.writer(f) 

然后,当你完成,你必须f可用,以便你可以做f.close()以确保您的文件内容刷新到磁盘。更好:请阅读新的with声明。

2

我在追加已创建的csv文件的同时,在Windows上运行时遇到类似的问题。

由于在这种情况下,以“二进制”模式编写和追加避免了为通过使用python脚本编写或附加的每一行添加额外的行。因此;

w = csv.writer(open(Fn,'ab'),dialect='excel')