您好,登錄后才能下訂單哦!
這篇文章主要介紹了Python如何利用utf-8-sig編碼格式解決寫入csv文件亂碼問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
先舉個例子,分別以不指定編碼
、指定編碼為 utf-8
、指定編碼為 utf-8-sig
三種方式來做比較,再將寫入 csv 文件和 txt 文件來做個對比
一、不指定編碼方式,直接存入 csv 文件
import csv with 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 csv with 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 csv with 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 文件中,內容都是完全正常的:
ith 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 就能避免這個錯誤。
知識點擴展:
utf-8和utf-8-sig的區別
前言:在寫入csv文件中,出現了亂碼的問題。
解決:utf-8 改為utf-8-sig
區別如下:
1、”utf-8“ 是以字節為編碼單元,它的字節順序在所有系統中都是一樣的,沒有字節序問題,因此它不需要BOM,所以當用"utf-8"編碼方式讀取帶有BOM的文件時,它會把BOM當做是文件內容來處理, 也就會發生類似上邊的錯誤.
2、“uft-8-sig"中sig全拼為 signature 也就是"帶有簽名的utf-8”, 因此"utf-8-sig"讀取帶有BOM的"utf-8文件時"會把BOM單獨處理,與文本內容隔離開,也是我們期望的結果.
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python如何利用utf-8-sig編碼格式解決寫入csv文件亂碼問題”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。