用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')

這對我來講是多餘的換行符。

相關文章
相關標籤/搜索