如何附加到CSV文件?

Mer*_*lin 13 python csv

使用Python附加CSV文件,我每隔一行获取一次数据.我该如何解决?

import csv

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

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

C:\test.csv 打开时看起来像这样:

1,2

3,4

1,2

3,4
Run Code Online (Sandbox Code Playgroud)

Joh*_*hin 42

追加与问题无关; 请注意前两行(来自原始文件的行)也是双倍行距.

真正的问题是您已在文本模式下打开文件.

无论信不信,CSV都是二进制格式.csv模块\r\n正如预期的那样编写误导性命名的"lineterminator(应该是"rowseparator"),然后Windows C运行时启动并替换\nwith,\r\n以便你\r\r\n在行之间.当你用Excel"打开"csv文件时它变得困惑

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

其他问题:

(1)不要将数据放在根目录(C:\)中.Windows在20世纪80年代继承了MS-DOS的分层文件系统.用它.

(2)如果必须在代码中嵌入硬连线文件名,请使用原始字符串r"c:\test.csv"...如果你有"c:\test.csv"'\ t'将被解释为TAB字符; 类似的问题\r\n

(3)Python手册中的示例与简洁的代码相比更加简洁.

不要这样做:

w = csv.writer(open('foo.csv', 'wb'))
Run Code Online (Sandbox Code Playgroud)

做这个:

f = open('foo.csv', 'wb')
w = csv.writer(f)
Run Code Online (Sandbox Code Playgroud)

然后,当您完成后,您就f可以使用f.close()以确保将文件内容刷新到磁盘.更好的是:阅读新with声明.


小智 5

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

在这种情况下,以“二进制”模式写入和附加可以避免向使用 python 脚本写入或附加的每行添加额外的行。所以;

w = csv.writer(open(Fn,'ab'),dialect='excel')
Run Code Online (Sandbox Code Playgroud)