解決方式
先講解答,原因下面說明。
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='' 應該總是安全的。
我用一張圖來補充說明
圖中四區塊,依序為:
-
with open(‘eggs.csv’, ‘w’, newline=‘’) as csvfile:
-
上面 1 的結果,顯示檔案中的所有符號(包含換行)
-
with open(‘eggs.csv’, ‘w’) as csvfile:
-
上面 3 的結果,顯示檔案中的所有符號(包含換行)
\n 就是 LF 換行符號
\r 就是 CR 回車符號
CR 通常稱為回車符,如果你用過打字機就會知道,如果你只回車,忘記換行,接下來打的字,會重覆在剛剛打好的字上方。
參考資料
csv — CSV File Reading and Writing — Python 3.9.5 documentation
換行 - 維基百科 裡面有 CR LF 的說明
回車 (控制字元) - 維基百科
【轉貼】_r_n和_n的差異 @ seacatcry的部落格 __ 痞客邦 __
windows - CSV file written with Python has blank lines between each row - Stack Overflow