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'打开outfile 。 csv.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)
文档链接
- https://docs.python.org/2/library/csv.html#csv.writer
- https://docs.python.org/3/library/csv.html#csv.writer
#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')
这对我来说是多余的换行符。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3164867