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
。 html
可是,当我在Microsoft Excel中打开生成的csv时,每条记录后都有一个额外的空白行! python
有没有办法使它不放在多余的空白行? ui
以二进制模式“ wb”打开文件在Python 3+中不起做用。 或者更确切地说,您必须在编写数据以前将数据转换为二进制。 那只是一个麻烦。 spa
相反,您应该将其保留在文本模式下,可是将换行符替换为空。 像这样: code
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
注意:彷佛这不是首选的解决方案,由于在Windows系统上如何添加额外的行。 如python文档中所述 : htm
若是csvfile是文件对象,则必须在有区别的平台上使用'b'标志打开它。 对象
Windows是其中一个不同凡响的平台。 尽管按照我下面所述更改行终止符可能已解决了该问题,但能够经过以二进制模式打开文件来彻底避免该问题。 有人可能会说这种解决方案更“优雅”。 在这种状况下,用行终止符“摆弄”可能会致使系统之间没法移植的代码,在这种状况下,在UNIX系统上以二进制模式打开文件不会产生任何效果。 即。 它致使跨系统兼容的代码。 文档
从Python Docs : get
在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'])
在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)
简单的答案是,不管输入仍是输出, 都应始终以二进制模式打开csv文件 ,不然在Windows上,行尾出现问题。 特别是在输出时,csv模块将写入\\r\\n
(标准CSV行终止符),而后(在文本模式下)运行时将\\n
替换为\\r\\n
(Windows标准行终止符),结果为\\r\\r\\n
。
摆弄lineterminator
不是解决方案。
我正在使用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')
这对我来讲是多余的换行符。