用Python编写的CSV文件每行之间都有空行

こ雲淡風輕ζ 提交于 2020-02-26 07:39:45
import csv

with open('thefile.csv', 'rb') as f:
  data = list(csv.reader(f))
  import collections
  counter = collections.defaultdict(int)

  for row in data:
        counter[row[10]] += 1


with open('/pythonwork/thefile_subset11.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    for row in data:
        if counter[row[10]] >= 504:
           writer.writerow(row)

此代码读取thefile.csv ,进行更改,并将结果写入thefile_subset1

但是,当我在Microsoft Excel中打开生成的csv时,每条记录后都有一个额外的空白行!

有没有办法使它不放在多余的空白行?


#1楼

以二进制模式“ wb”打开文件在Python 3+中不起作用。 或者更确切地说,您必须在编写数据之前将数据转换为二进制。 那只是一个麻烦。

相反,您应该将其保留在文本模式下,但是将换行符替换为空。 像这样:

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:

#2楼

注意:似乎这不是首选的解决方案,因为在Windows系统上如何添加额外的行。 如python文档中所述

如果csvfile是文件对象,则必须在有区别的平台上使用'b'标志打开它。

Windows是其中一个与众不同的平台。 尽管按照我下面所述更改行终止符可能已解决了该问题,但可以通过以二进制模式打开文件来完全避免该问题。 有人可能会说这种解决方案更“优雅”。 在这种情况下,用行终止符“摆弄”可能会导致系统之间无法移植的代码,在这种情况下,在UNIX系统上以二进制模式打开文件不会产生任何效果。 即。 它导致跨系统兼容的代码。

Python Docs

在Windows上,附加到模式的'b'以二进制模式打开文件,因此也有'rb','wb'和'r + b'之类的模式。 Windows上的Python区分文本文件和二进制文件。 当读取或写入数据时,文本文件中的行尾字符会自动更改。 对于ASCII文本文件来说,对文件数据进行这种幕后修改是可以的,但它会破坏JPEG或EXE文件中的二进制数据。 读写此类文件时,请务必小心使用二进制模式。 在Unix上,将'b'附加到该模式没有什么坏处,因此您可以在平台上独立地将其用于所有二进制文件。

原件

作为csv.writer的可选参数的一部分,如果您获得多余的空行,则可能必须更改lineterminator(信息在此处 )。 以下示例是从python页面csv docs改编的 将其从“ \\ n”更改为应有的值。 由于这只是解决问题的一种手段,因此可能会或可能不会起作用,但这是我的最佳猜测。

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n')
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

#3楼

在Python 2中,使用模式'wb'而不是'w'打开outfilecsv.writer\\r\\n写入文件。 如果您未以二进制模式打开文件,它将写入\\r\\r\\n因为在Windows 文本模式下会将每个\\n转换为\\r\\n

在Python 3中,所需的语法已更改,因此请使用附加参数newline=''打开outfile

例子:

# Python 2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
    writer = csv.writer(outfile)

# Python 3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)

文档链接


#4楼

简单的答案是,无论输入还是输出, 都应始终以二进制模式打开csv文件 ,否则在Windows上,行尾出现问题。 特别是在输出时,csv模块将写入\\r\\n (标准CSV行终止符),然后(在文本模式下)运行时将\\n替换为\\r\\n (Windows标准行终止符),结果为\\r\\r\\n

摆弄lineterminator不是解决方案。


#5楼

我正在使用Python 3编写此答案,因为最初我遇到了同样的问题。

我应该使用PySerial从arduino获取数据,并将其写入.csv文件中。 在我的情况下,每个读数都以'\\r\\n'结尾,因此换行符总是分隔每行。

就我而言, newline=''选项不起作用。 因为它显示了一些错误,例如:

with open('op.csv', 'a',newline=' ') as csv_file:

ValueError: illegal newline value: ''

因此,他们似乎不接受此处省略换行符。

仅在这里看到答案之一,我在writer对象中提到了行终止符,例如,

writer = csv.writer(csv_file, delimiter=' ',lineterminator='\\r')

这对我来说是多余的换行符。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!