csv.writerows()在每行之后放置换行符

时间:2015-06-19 03:17:39

标签: python csv python-3.x

这是来自 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,显然在结尾处还有一个more。当我将它带入Excel时,每行之间会出现空白行。如果我用Notepad ++打开它,也一样。

但是,如果我\n来自命令行,则\n不会显示。

我在文件末尾看到了另一个关于\n的问答 - 但是这一行在每行末尾大约是more。 (而且我不明白为什么\n没有给#!/bin/bash name=`basename $1` case $2 in start) echo $$ > /var/run/service.pid; exec 2>&1 $1 1>/var/log/$name.stdout ;; stop) kill `cat /var/run/service.pid` ;; *) echo "usage: <path to app> {start|stop}" ;; esac 。)

我计划将文件带入OpenOffice Calc。

3 个答案:

答案 0 :(得分:7)

仅在Windows上使用Python时才会出现此问题。

在Python v3中,您需要在打开调用中添加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

答案 1 :(得分:2)

这是一个额外的回车,这是一个与Python 2/3差异无关的特定于Windows的问题。如果您在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'添加到每行的末尾。发生了什么:

  1. csv.writerows()写入适当的数据行,然后以'\r\n'结束行
  2. Python的内部处理(因为您在Windows上)看到行尾#39; \n&#39;并认为需要将其更改为'\r\n'。所以你得到'\r\r\n'
  3. 您没有看到打印到控制台的原因是因为它没有检测到额外的'\r'作为新行,而Excel和Notepad ++就是这样。

    对于Python 3,您应该使用此处记录的newline=''选项:https://docs.python.org/3/library/csv.html

      

    csv.writer(csvfile,dialect =&#39; excel&#39;,** fmtparams)

         

    返回一个编写器对象,负责将用户的数据转换为给定的类文件对象上的分隔字符串。 csvfile可以是具有write()方法的任何对象。 如果csvfile是文件对象,则应使用newline =&#39;&#39;打开它。 [1]。

答案 2 :(得分:1)

我遇到了同样的问题,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)