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() 在每一行之后放置换行符的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表列表写入 CSV 文件 Python?

在每 3 列之后拆分一行并将这 3 列作为新行传输到 r

是否可以在每 10 行带有“普通”文本的行之后插入一行带有粗体文本的行

EXCEL表格如何在每一页最后一行自动求一列的和,要求是自动的,不管是多少行只要够一页它就求和

递归回溯法求N皇后问题

在 Wiki 标记中添加无序列表