[Python] 如何產生可直接用 Excel 開啟的 CSV 檔案

Toki Kanno
Pinkoi Engineering
Published in
3 min readJun 27, 2017

很多系統都會提供 CSV 匯出的功能,讓使用者可以下載自己的資料,然後再用 Excel 之類的軟體進行自己想要的後續處理。由於 Python 已經內建了一個 csv 模組,所以要達成這個任務其實還蠻……容易的……如果你的系統裡的資料全是英文的話 :-P

當要匯出的資料裡有 unicode 或是換行符號之類的特殊字元時,單純使用 Ptython 的 csv 模組,是無法產生出一個可以讓 Excel 直接打開的 CSV 檔案的。以下提供一些簡單的小秘訣。

使用 UTF-16 編碼,並加上 BOM

微軟系統的軟體(像是 Windows 或是 Office),在 unicode 的處理上,其實是預設使用 UCS2 (UTF-16) 而非 UTF-8。要產生能讓 Excel 直接開啟的 CSV 檔案,必需使用 UTF-16 作為檔案的編碼。而也由於使用了 UTF-16,所以檔案的開頭也必需加上 BOM (Byte Order Mark) 作為辨識使用。

但光是使用 UTF-16 編碼是不足以讓 Excel 正確的開啟的,必需要再配合下一個祕訣,不然你會發現 Excel 雖然能直接打開產生出來的檔案,但只會把資料當做一行一行的文字,而不會再把每一格資料細分出來。

使用 Tab 當作分隔符號

等等…這是 TSV (tab separated values) 而不是 CSV (comma separated values) 吧?! 沒錯,就是要產生掛羊頭賣狗肉的 TSV 再配合 UTF-16 編碼才能夠順利的讓 Excel 直接開啟。

把所有欄位裡的換行符號換成 \r\n

如果要匯出的資料在單一欄位裡有多行的文字,而你又想保留這個效果的時候,就要多做這一道處理。

原因是在不同的作業系統上的 Excel,其實對於單一欄位裡換行符號的解讀不太一樣。舉個例子來說,在 MacOSX 上的 Excel,會把 \r 當做欄位中多行文字的換行符號。但在 Windows 上的 Excel,則會把 \n 當做欄位中多行文字的換行符號。所以最保險的方式,就是把所有單一的 \r 或 \n,全部換成 \r\n 的文字序列。

使用 CSVKIT

使用這個並不能直接解決上面提到的問題,但是它可以幫你快速輸出正確格 UTF-16 的 CSV 檔案。範例程式如下:

但要注意的是,csvkit.writer 有雞婆多幫你做了把所有的換行符號都轉換成 \r 這件事,所以直接使用 csvkit.unicsv 下的 UnicodeCSVWriter 才能確保不會有任何的意外發生。

--

--