用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_subset1

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

有没有办法让它不能把一个额外的空白行?

在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) 

文档链接

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

相反,你应该保持它在文本模式,但重写换行符为空。 像这样:

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

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

摆弄lineterminator不是解决方案。

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

如果csvfile是一个文件对象,那么必须在平台上用“b”标志打开,这是有所作为的。

Windows是一个这样的平台,这是有所作为的。 如下所述更改行结束符可能会解决问题,但可以通过以二进制模式打开文件来完全避免该问题。 有人可能会说这个解决方案更“有效”。 在这种情况下,使用行终止符“摆弄”可能会导致系统之间的不可移植代码,在unix系统上以二进制模式打开文件不会产生任何效果。 即。 它会导致交叉系统兼容的代码。

从Python文档 :

在Windows上,附加到模式的“b”以二进制模式打开文件,所以也有像“rb”,“wb”和“r + b”这样的模式。 Windows上的Python区分文本和二进制文件; 数据读取或写入时,文本文件中的行尾字符会自动稍微改变。 这种对文件数据的后台修改对于ASCII文本文件来说是很好的,但是它会像JPEG或者EXE文件那样破坏二进制数据。 读取和写入这些文件时要非常小心地使用二进制模式。 在Unix上,在模式中附加一个'b'并不会造成什么影响,所以你可以在所有的二进制文件中使用它。

原文

作为csv.writer的可选参数的一部分,如果你得到额外的空白行,你可能需要改变lineterminator(信息在这里 )。 下面的例子是从python页面的csv文档创建的。 把它从'\ 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']) 

我正在写这个答案与Python 3,因为我最初有同样的问题。

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

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

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

所以他们似乎在这里不接受换行符。

只看到这里的答案之一,我在作家对象中提到了行结束符,

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

这对我来说是跳过了额外的换行符。