【Python 必会技巧】利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
先舉個例子,分別以不指定編碼、指定編碼為 utf-8、指定編碼為 utf-8-sig 三種方式來做比較,再將寫入 csv 文件和 txt 文件來做個對比
一、不指定編碼方式,直接存入 csv 文件
import csvwith open('test.csv', 'w') as fp:writer = csv.writer(fp)writer.writerow(['漢語', '俄語', '韓語', '日語', '英語'])writer.writerow(['愛你', 'люблю тебя', '????', '愛しています', 'love you'])此時運行程序會報以下錯誤:
UnicodeEncodeError: 'gbk' codec can't encode character '\uc0ac' in position 14: illegal multibyte sequence二、指定編碼為 utf-8,再存入 csv 文件
接下來嘗試將內容以 utf-8 編碼方式存入 test.csv 文件中,可以看到除了英文,其他的全都是亂碼:
import csvwith open('test.csv', 'w', encoding='utf-8') as fp:writer = csv.writer(fp)writer.writerow(['漢語', '俄語', '韓語', '日語', '英語'])writer.writerow(['愛你', 'люблю тебя', '????', '愛しています', 'love you'])三、指定編碼為 utf-8-sig,再存入 csv 文件
當將編碼方式換成 utf-8-sig 之后,顯示為正常:
import csvwith open('test.csv', 'w', encoding='utf-8-sig') as fp:writer = csv.writer(fp)writer.writerow(['漢語', '俄語', '韓語', '日語', '英語'])writer.writerow(['愛你', 'люблю тебя', '????', '愛しています', 'love you'])四、不指定編碼方式,直接存入 txt 文件
with open('test.txt','w') as fp:fp.write('愛你, люблю тебя, ????, 愛しています, love you')和存入 csv 文件一樣,也會報以下錯誤:
UnicodeEncodeError: 'gbk' codec can't encode character '\uc0ac' in position 16: illegal multibyte sequence五、指定編碼為 utf-8 / utf-8-sig,再存入 txt 文件
以 utf-8 或者 utf-8-sig 編碼方式存入 test.txt 文件中,內容都是完全正常的:
with open('test.txt','w', encoding='utf-8') as fp:fp.write('愛你, люблю тебя, ????, 愛しています, love you') with open('test.txt','w', encoding='utf-8-sig') as fp:fp.write('愛你, люблю тебя, ????, 愛しています, love you')utf-8 與 utf-8-sig 有什么區別?
-
utf-8 以字節為編碼單元,它的字節順序在所有系統中都是一樣的,沒有字節序問題,也因此它實際上并不需要 BOM;
-
uft-8-sig 中 sig 全拼為 signature,即帶有簽名的 utf-8(UTF-8 with BOM);
-
BOM 全稱 ByteOrder Mark,字節順序標記,出現在文本文件頭部,Unicode編碼標準中用于標識文件是采用哪種格式的編碼。
為什么寫入 csv 文件要用 utf-8-sig 編碼?
-
Excel 在讀取 csv 文件的時候是通過讀取文件頭上的 BOM 來識別編碼的,如果文件頭無 BOM 信息,則默認按照 Unicode 編碼讀取。
-
當我們使用 utf-8 編碼來生成 csv 文件的時候,并沒有生成 BOM 信息,Excel 就會自動按照 Unicode 編碼讀取,就會出現亂碼問題了。
為什么寫入 txt 文件要用 utf-8 編碼?
- 在寫入 txt 文件時,Windows 會默認轉碼成 gbk,遇到某些 gbk 不支持的字符就會報錯,在打開文件時就聲明編碼方式為 utf-8 就能避免這個錯誤。
總結
以上是生活随笔為你收集整理的【Python 必会技巧】利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中银稳富封闭式有风险吗?不小心买了中银封
- 下一篇: Python 算法之递归与尾递归,斐波那