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')
這對我來講是多餘的換行符。