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

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_subset1html

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

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


#1楼

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

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

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

#2楼

注意:彷佛这不是首选的解决方案,由于在Windows系统上如何添加额外的行。 如python文档中所述htm

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

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

Python Docsget

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

原件

做为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')

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

相关文章
相关标签/搜索