Python 2 CSV编写器在Windows上生成错误的行终止符

时间:2009-07-23 07:34:12

标签: python windows csv python-2.x line-endings

根据its documentation 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文件使用行终止符'\ r \ n \ r \ n'

0,1,2,3,4

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

a,b,c,d,e

A,B,C,D,E

这是一个错误还是我使用csv.writer时出了什么问题?

Python版本:

  

ActivePython 2.6.2.2(ActiveState   Software Inc.)基于Python 2.6.2   (r262:71600,2009年4月21日,15:05:37)   [win v300 32位(英特尔)]在win32上

Windows Vista上的

3 个答案:

答案 0 :(得分:64)

在Python 2.x中,始终以二进制模式打开文件,如文档所述。 csv按预期编写\r\n,但随后基础Windows文本文件机制会切入并将\n更改为\r\n ...总效果:\r\r\n

来自csv.writer文档:

  

如果 csvfile 是一个文件对象,则必须在平台上使用'b'标志打开它,这会产生影响。

关于实际说出主要罪魁祸首的名字似乎有些缄默: - )

编辑:正如@jebob在对这个答案的评论中所提到的并基于@Dave Burton的answer,要在Python 2和3中处理这个案例,你应该做到以下几点:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')

答案 1 :(得分:24)

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

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')

答案 2 :(得分:22)

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

df2.reset_index(inplace = True) df3 = pd.melt(df2, id_vars=['Sample'], value_vars=list(cols)) df4 = pd.merge(df3, df1, on='Sample') df4['moo'] = df4['Group'] + '_' + df4['variable'] df5 = pd.pivot_table(df4, values='value', index='Animal', columns='moo') df6 = df1.groupby('Animal').agg('first') pd.concat([df5, df6], axis=1).drop('Sample',1).drop('Group',1)

这是从\ r \ n。

更改默认分隔符的一种更简单的方法