45

根据其文档,csv.writer 默认应使用 '\r\n' 作为 lineterminator。

import csv

with open("test.csv", "w") as f:
    writer = csv.writer(f)

    rows = [(0,1,2,3,4),
           (-0,-1,-2,-3,-4),
           ("a","b","c","d","e"),
           ("A","B","C","D","E")]           

    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
    writer.writerows(rows)
    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")

这打印

\r\n
\r\n

正如预期的那样。但是,创建的 csv 文件使用 lineterminator '\r\r\n'

0,1,2,3,4

0,-1,-2,-3,-4

a,b,c,d,e

A,B,C,D,E

这是一个错误还是我对 csv.writer 的使用有问题?

蟒蛇版本:

ActivePython 2.6.2.2 (ActiveState Software Inc.) 基于 Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] on win32

在 Windows Vista 上

4

3 回答 3

71

在 Python 2.x 中,始终以二进制模式打开文件,如文档所述。csv按照您的预期写入\r\n,但随后底层的 Windows 文本文件机制介入并将其更改\n\r\n......总效果:\r\r\n

csv.writer文档中:

如果csvfile是一个文件对象,则必须在'b'不同的平台上使用标志打开它。

对于实际说出罪魁祸首的名字似乎有些沉默:-)

编辑:正如@jebob 在对此答案的评论中提到的并基于@Dave Burton 的答案,要在 Python 2 和 3 中处理这种情况,您应该执行以下操作:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')
于 2009-07-23T07:53:18.917 回答
26

不幸的是,它与 Python 3 的 csv 模块有点不同,但此代码适用于 Python 2 和 Python 3:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')
于 2012-06-27T22:08:27.027 回答
23

要更改 Python 2.7 csv writer 中的行终止符,请使用

writer = csv.writer(f, delimiter = '|', lineterminator='\n')

这是从 \r\n 更改默认分隔符的更简单的方法。

于 2015-07-14T22:24:24.490 回答