根据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版本:
Windows Vista上的ActivePython 2.6.2.2(ActiveState Software Inc.)基于Python 2.6.2 (r262:71600,2009年4月21日,15:05:37) [win v300 32位(英特尔)]在win32上
答案 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。
更改默认分隔符的一种更简单的方法