如何将内容添加到CSV文件中?

11 浏览
0 Comments

如何将内容添加到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)

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

1,2
3,4
1,2
3,4

admin 更改状态以发布 2023年5月21日
0
0 Comments

我在Windows上遇到了一个类似的问题,需要添加已经创建好的CSV文件。

在这种情况下,使用“二进制”模式写入和追加可以避免使用Python脚本写入或追加时添加额外的行。因此;

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

0
0 Comments

Appending is irrelevant to the problem; notice that the first two rows (those from the original file) are also double-spaced.

The real problem is that you have opened your file in text mode.

CSV is a binary format, believe it or not. The csv module is writing the misleadingly-named "lineterminator (should be "rowseparator") as \r\n as expected but then the Windows C runtime kicks in and replaces the \n with \r\n so that you have \r\r\n between rows. When you "open" the csv file with Excel it becomes confused

Always open your CSV files in binary mode ('rb', 'wb', 'ab'), whether you are operating on Windows or not. That way, you will get the expected rowseparator (CR LF) even on *x boxes, your code will be portable, and any linefeeds embedded in your data won't be changed into something else (on writing) or cause dramas (on input, provided of course they're quoted properly).

Other problems:

(1) Don't put your data in your root directory (C:\). Windows inherited a hierarchical file system from MS-DOS in the 1980s. Use it.

(2) If you must embed hard-wired filenames in your code, use raw strings r"c:\test.csv" ... if you had "c:\test.csv" the '\t' would be interpreted as a TAB character; similar problems with \r and \n

(3) The examples in the Python manual are aligned more towards brevity than robust code.

Don't do this:

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

Do this:

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

Then when you are finished, you have f available so that you can do f.close() to ensure that your file contents are flushed to disk. Even better: read up on the new with statement.

0