csv.writer() 寫入 csv 檔後,每行間會多一空白行

解決方式

先講解答,原因下面說明。

import csv

# 這行指令會在每行間會多一空白行
with open('eggs.csv', 'w') as csvfile:

# 這個作法沒問題
with open('eggs.csv', 'w', newline='') as csvfile:

文件 vs. 範例

寫程式時,想要使用某函式,但沒用過或忘記時,大部分人是用 google 找答案。

這時有兩個方向:一個是看原始文件、另一個是看範例(特別是 stackoverflow 的問答)。

如果原始文件的範例寫得不錯,那當然最好。如果不足,那只好看其他人碰到類似情形時,是如何解決的。

我自己的習慣是先看範例,先解決問題再說,這個習慣不太好。

為什麼講 csv.writer() 會先說這麼多呢?因為這個問題的產生,就是碰到問題先找範例。

stackoverflow 的問答雖然常常能解決問題,但提醒大家要留意問與答個別的時間,盡量找比較新的問答。

「csv.writer() 寫入 csv 檔後,每行間會多一空白行」

這個問題的產生,我當初就是因為直接參考 stackoverflow 的解答,然後又看到舊的。

雖然看到空白行很奇怪,但之前不影響我的目的,就沒仔細找原因。


原因

在原始文件中(最後一行,網址請見參考資料)有說:

如果沒有指定 newline='' ,則嵌入引號中的換行符將無法正確解析,
並且在寫入時,使用 \r\n 換行的平台會有多餘的 \r 寫入。
由於 csv 模塊會執行自己的(通用)換行符處理,因此指定 newline='' 應該總是安全的。

我用一張圖來補充說明

圖中四區塊,依序為:

  1. with open(‘eggs.csv’, ‘w’, newline=’’) as csvfile:

  2. 上面 1 的結果,顯示檔案中的所有符號(包含換行)

  3. with open(‘eggs.csv’, ‘w’) as csvfile:

  4. 上面 3 的結果,顯示檔案中的所有符號(包含換行)

\n 就是 LF 換行符號
\r 就是 CR 回車符號

CR 通常稱為回車符,如果你用過打字機就會知道,如果你只回車,忘記換行,接下來打的字,會重覆在剛剛打好的字上方。


參考資料

csv — CSV File Reading and Writing — Python 3.9.5 documentation
https://docs.python.org/3/library/csv.html#csv.writer

換行 - 維基百科 裡面有 CR LF 的說明

回車 (控制字元) - 維基百科

【轉貼】_r_n和_n的差異 @ seacatcry的部落格 __ 痞客邦 __

windows - CSV file written with Python has blank lines between each row - Stack Overflow

2 Likes