【问题标题】:Why does CSV file contain a blank line in between each data line when outputting with Dictwriter in Python [duplicate]python - 在Python中使用Dictwriter输出时,为什么CSV文件在每个数据行之间包含一个空白行[重复]
【发布时间】:2012-02-03 12:53:59
【问题描述】:

我正在使用 DictWriter 将字典中的数据输出到 csv 文件。为什么 CSV 文件的每个数据行之间有一个空行?这不是什么大问题,但我的数据集很大,不适合一个 csv 文件,因为它有太多行,因为“双间距”使文件中的行数加倍。

我写字典的代码是:

headers=['id', 'year', 'activity', 'lineitem', 'datum']
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
output.writerow(dict((fn,fn) for fn in headers))
for row in rows:
    output.writerow(row)

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

    默认情况下,csv 模块中的类使用 Windows 风格的行终止符 (\r\n) 而不是 Unix 风格的 (\n)。这可能是导致明显双换行符的原因吗?

    如果是这样,您可以在 DictWriter 构造函数中覆盖它:

    output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers)
    

    【讨论】:

    • 或者您可以像这样打开输出 csv:open(filename, "wb").它为我解决了这个问题。
    • 不确定是 Python 3 还是其他原因,但是当我使用“wb”时,它会写入一个空白文件,而 lineterminator = '\n' 选项工作得很好。附带说明一下,考虑到它是文本文件,您想要以二进制模式编写 CSV 文件似乎违反直觉。也许这仅与阅读有关,与写作无关。
    • 在python 3中,如果你使用'wb',你需要指定你的字符串的编码,以便它知道如何将你的unicode文本转换为字节pythoncentral.io/encoding-and-decoding-strings-in-python-3-xafaik,如果你只使用'w'然后你写一个字符串,它将使用 ascii 编码,如果你有任何 unicode 字符则失败。
    • Windows 上 Python 3 中的问题似乎是文件对象为每一行写入 \r\n,但 csv 编写器似乎额外编写了一个 \r。在十六进制编辑器中,您将看到0D 0D 0A,这将使文本编辑器识别Macintosh 换行样式,从而为\r\r 显示两个换行符并忽略\n。将newline='\n' 提供给open() 为我解决了这个问题(写\r\n,这对于Excel 方言是正确的)。
    • Read the docs for python 3: 如果 csvfile 是一个文件对象,它应该用 newline='' 打开。这意味着,使用 python 3 你应该总是这样写:open('some.csv', 'w', newline='')(source)
    【解决方案2】:

    来自http://docs.python.org/library/csv.html#csv.writer

    如果 csvfile 是一个文件对象,它必须以‘b’标志打开 不同的平台。

    换句话说,当打开文件时,您传递的是 'wb' 而不是 'w'。
    您还可以在完成写入文件后使用with 语句关闭文件。
    测试示例如下:

    from __future__ import with_statement # not necessary in newer versions
    import csv
    headers=['id', 'year', 'activity', 'lineitem', 'datum']
    with open('file3.csv','wb') as fou: # note: 'wb' instead of 'w'
        output = csv.DictWriter(fou,delimiter=',',fieldnames=headers)
        output.writerow(dict((fn,fn) for fn in headers))
        output.writerows(rows)
    

    【讨论】:

    • 谢谢!我只是将 open 标志从“w”更改为“wb”,它可以工作,而无需添加任何换行符。 f = open(file_path, 'wb') file_writer = csv.writer(f, quotechar='"', quoting=csv.QUOTE_MINIMAL)
    【解决方案3】:

    更改此行中的“w”(写入):

    output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
    

    To 'wb' (write binary) 为我解决了这个问题:

    output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers)
    

    Python v2.75: Open()

    感谢@dandrejvv 在上面原始帖子的评论中提供的解决方案。

    【讨论】:

    • 当使用 'wb' 时,我发现以后无法在 Python 脚本中追加,否则最终的 CSV 将只包含写入的最后一行。我必须用'a'打开输出文件
    【解决方案4】:

    我刚刚测试了你的sn-p,这里没有双倍行距。行尾是\r\n,所以我要检查你的情况是:

    1. 您的编辑器正在正确读取 DOS 文件
    2. 在您的 rows dict 的值中不存在 \n。

    (请注意,即使使用 \n 输入值,DictWriter 也会自动引用该值。)

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2011-03-21
      • 2021-07-07
      • 2016-06-26
      • 1970-01-01
      相关资源
      最近更新 更多