csv.writerows() 在每一行之后放置换行符
Posted
技术标签:
【中文标题】csv.writerows() 在每一行之后放置换行符【英文标题】:csv.writerows() puts newline after each row 【发布时间】:2015-09-04 22:02:39 【问题描述】:这是O'Reilly Cookbook(截断数据集)中的一个示例
headers = ['Symbol','Price','Date','Time','Change','Volume']
rows = ['Symbol': 'AA', 'Volume': 181800, 'Change': -0.18,
'Time': '9:36am', 'Date': '6/11/2007', 'Price': 39.48,
'Symbol': 'AIG', 'Volume': 195500, 'Change': -0.15,
'Time': '9:36am', 'Date': '6/11/2007', 'Price': 71.38 ]
with open('stocks2.csv','w') as f:
f_csv = csv.DictWriter(f, headers)
f_csv.writeheader()
f_csv.writerows(rows)
输出文件在每一行的末尾都有一个\n
,而且显然还有一个。当我把它带入 Excel 时,每行之间都有空行。如果我用 Notepad++ 打开它也是一样的。
但是,如果我在命令行中more
,\n
不会出现。
我在文件末尾看到了另一个关于\n
的问答 - 但这个是关于每行末尾的\n
。 (而且我不明白为什么more
不提供\n
。)
我打算将文件导入 OpenOffice Calc。
【问题讨论】:
Python 3.3 CSV.Writer writes extra blank rows的可能重复 投票关闭为重复;如this 问题(以及 csv 文档)中所述,您需要在open
中使用newline=''
。
【参考方案1】:
这个问题只发生在 Windows 上的 Python 上。
在 Python v3 中,您需要在 open call per 中添加newline=''
:
Python 3.3 CSV.Writer writes extra blank rows
在 Python v2 上,您需要在 open() 调用中使用“b”将文件作为二进制文件打开,然后再传递给 csv
换行
with open('stocks2.csv','w') as f:
到:
with open('stocks2.csv','wb') as f:
解决问题
有关此问题的更多信息:
CSV in Python adding an extra carriage return, on Windows
【讨论】:
这在 Python 3 中是不正确的,这就是 OP 标记问题的方式。【参考方案2】:我在适用于 Python 3 的 Windows 上遇到了这个问题。我尝试在打开文件时更改换行符参数,它与 newline=''
正常工作。
将newline=''
添加到open()方法如下:
with open('stocks2.csv','w', newline='') as f:
f_csv = csv.DictWriter(f, headers)
f_csv.writeheader()
f_csv.writerows(rows)
它会起到魅力的作用。
希望对你有帮助。
【讨论】:
【参考方案3】:这是一个额外的回车,这是一个特定于 Windows 的问题,与 Python 2/3 的差异无关。如果您在 Notepad++ 中打开文件并启用Show all characters
,您将看到以下内容:
Symbol,Price,Date,Time,Change,Volume[CR]
[CR][LF]
AA,39.48,6/11/2007,9:36am,-0.18,181800[CR]
[CR][LF]
AIG,71.38,6/11/2007,9:36am,-0.15,195500[CR]
[CR][LF]
这是因为 Windows 上的 Python 正在将您的行尾从 '\n'
转换为 '\r\n'
,而 writerows()
函数已经将 '\r\n'
添加到每一行的末尾。发生了什么:
-
csv.writerows() 写入相应的数据行,然后以
'\r\n'
结束该行
Python 的内部处理(因为您在 Windows 上)看到“\n
”行的结尾,并认为需要将其更改为'\r\n'
。所以你会得到'\r\r\n'
。
您没有看到打印到控制台有问题的原因是它没有检测到额外的 '\r'
作为新行,而 Excel 和 Notepad++ 是。
对于 Python 3,您应该使用此处记录的 newline=''
选项:https://docs.python.org/3/library/csv.html。
csv.writer(csvfile, dialect='excel', **fmtparams)
返回一个 writer 对象,负责将用户的数据转换为给定类文件对象上的分隔字符串。 csvfile 可以是具有 write() 方法的任何对象。 如果 csvfile 是一个文件对象,它应该用 newline='' [1] 打开。
【讨论】:
谢谢你的解释+1【参考方案4】:我也遇到过同样的问题,Om Prakash 的修复几乎对我有用,但是我在 for 循环而不是列表中编写了一系列字符串,对我来说,它只是作为附加而不是 w 来解决的,并且\n 而不是 '':
with open('stocks2.csv','a', newline='\n') as f:
f_csv = csv.DictWriter(f, headers)
f_csv.writeheader()
f_csv.writerows(rows)
【讨论】:
【参考方案5】:可能有助于更改“lineterminator”参数,如下所示:
csv.writer(<yourfile>,delimiter="\n",lineterminator="\n")
【讨论】:
以上是关于csv.writerows() 在每一行之后放置换行符的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在每 10 行带有“普通”文本的行之后插入一行带有粗体文本的行