Python利用 utf-8-sig 編碼格式解決寫入 csv 文件亂碼問題
先舉個(gè)例子,分別以不指定編碼
、指定編碼為 utf-8
、指定編碼為 utf-8-sig
三種方式來(lái)做比較,再將寫入 csv 文件和 txt 文件來(lái)做個(gè)對(duì)比
一、不指定編碼方式,直接存入 csv 文件
import csv with open('test.csv', 'w') as fp: writer = csv.writer(fp) writer.writerow(['漢語(yǔ)', '俄語(yǔ)', '韓語(yǔ)', '日語(yǔ)', '英語(yǔ)']) writer.writerow(['愛你', 'люблю тебя', '사랑해요', '愛しています', 'love you'])
此時(shí)運(yùn)行程序會(huì)報(bào)以下錯(cuò)誤:
UnicodeEncodeError: 'gbk' codec can't encode character '\uc0ac' in position 14: illegal multibyte sequence
二、指定編碼為 utf-8,再存入 csv 文件
接下來(lái)嘗試將內(nèi)容以 utf-8
編碼方式存入 test.csv 文件中,可以看到除了英文,其他的全都是亂碼:
import csv with open('test.csv', 'w', encoding='utf-8') as fp: writer = csv.writer(fp) writer.writerow(['漢語(yǔ)', '俄語(yǔ)', '韓語(yǔ)', '日語(yǔ)', '英語(yǔ)']) writer.writerow(['愛你', 'люблю тебя', '사랑해요', '愛しています', 'love you'])
三、指定編碼為 utf-8-sig,再存入 csv 文件
當(dāng)將編碼方式換成 utf-8-sig
之后,顯示為正常:
import csv with open('test.csv', 'w', encoding='utf-8-sig') as fp: writer = csv.writer(fp) writer.writerow(['漢語(yǔ)', '俄語(yǔ)', '韓語(yǔ)', '日語(yǔ)', '英語(yǔ)']) writer.writerow(['愛你', 'люблю тебя', '사랑해요', '愛しています', 'love you'])
四、不指定編碼方式,直接存入 txt 文件
with open('test.txt','w') as fp: fp.write('愛你, люблю тебя, 사랑해요, 愛しています, love you')
和存入 csv 文件一樣,也會(huì)報(bào)以下錯(cuò)誤:
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 文件中,內(nèi)容都是完全正常的:
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 有什么區(qū)別?
utf-8
以字節(jié)為編碼單元,它的字節(jié)順序在所有系統(tǒng)中都是一樣的,沒有字節(jié)序問題,也因此它實(shí)際上并不需要 BOM;uft-8-sig
中 sig 全拼為 signature,即帶有簽名的 utf-8(UTF-8 with BOM);BOM
全稱 ByteOrder Mark,字節(jié)順序標(biāo)記,出現(xiàn)在文本文件頭部,Unicode編碼標(biāo)準(zhǔn)中用于標(biāo)識(shí)文件是采用哪種格式的編碼。
為什么寫入 csv 文件要用 utf-8-sig 編碼?
- Excel 在讀取 csv 文件的時(shí)候是通過讀取文件頭上的 BOM 來(lái)識(shí)別編碼的,如果文件頭無(wú) BOM 信息,則默認(rèn)按照 Unicode 編碼讀取。
- 當(dāng)我們使用 utf-8 編碼來(lái)生成 csv 文件的時(shí)候,并沒有生成 BOM 信息,Excel 就會(huì)自動(dòng)按照 Unicode 編碼讀取,就會(huì)出現(xiàn)亂碼問題了。
為什么寫入 txt 文件要用 utf-8 編碼?
在寫入 txt 文件時(shí),Windows 會(huì)默認(rèn)轉(zhuǎn)碼成 gbk,遇到某些 gbk 不支持的字符就會(huì)報(bào)錯(cuò),在打開文件時(shí)就聲明編碼方式為 utf-8 就能避免這個(gè)錯(cuò)誤。
知識(shí)點(diǎn)擴(kuò)展:
utf-8和utf-8-sig的區(qū)別
前言:在寫入csv文件中,出現(xiàn)了亂碼的問題。
解決:utf-8 改為utf-8-sig
區(qū)別如下:
1、”utf-8“ 是以字節(jié)為編碼單元,它的字節(jié)順序在所有系統(tǒng)中都是一樣的,沒有字節(jié)序問題,因此它不需要BOM,所以當(dāng)用"utf-8"編碼方式讀取帶有BOM的文件時(shí),它會(huì)把BOM當(dāng)做是文件內(nèi)容來(lái)處理, 也就會(huì)發(fā)生類似上邊的錯(cuò)誤.
2、“uft-8-sig"中sig全拼為 signature 也就是"帶有簽名的utf-8”, 因此"utf-8-sig"讀取帶有BOM的"utf-8文件時(shí)"會(huì)把BOM單獨(dú)處理,與文本內(nèi)容隔離開,也是我們期望的結(jié)果.
總結(jié)
以上所述是小編給大家介紹的Python利用 utf-8-sig 編碼格式解決寫入 csv 文件亂碼問題,希望對(duì)大家有所幫助,也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
python實(shí)現(xiàn)將JSON文件中的數(shù)據(jù)格式化處理
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,常用于Web服務(wù)間的數(shù)據(jù)傳輸,Python內(nèi)置了??json??模塊,能夠方便地進(jìn)行JSON數(shù)據(jù)的解析與格式化,本文將通過具體的Python代碼實(shí)例,深入探討如何將JSON文件中的數(shù)據(jù)進(jìn)行格式化處理,需要的朋友可以參考下2024-03-03python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的貪吃蛇游戲附代碼
這篇文章主要介紹了python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的貪吃蛇游戲附代碼,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06Python json格式化打印實(shí)現(xiàn)過程解析
這篇文章主要介紹了Python json格式化打印實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07python微信公眾號(hào)之關(guān)鍵詞自動(dòng)回復(fù)
這篇文章主要為大家詳細(xì)介紹了python微信公眾號(hào)之關(guān)鍵詞自動(dòng)回復(fù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06python調(diào)用另外一個(gè)py文件中函數(shù)的具體步驟
這篇文章主要給大家介紹了關(guān)于python調(diào)用另外一個(gè)py文件中函數(shù)的具體步驟,要在一個(gè)Python文件中調(diào)用其他Python文件中的方法,可以使用Python的模塊導(dǎo)入功能,需要的朋友可以參考下2023-11-11python利用OpenCV2實(shí)現(xiàn)人臉檢測(cè)
這篇文章主要為大家詳細(xì)介紹了python利用OpenCV2實(shí)現(xiàn)人臉檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12python實(shí)現(xiàn)小世界網(wǎng)絡(luò)生成
今天小編就為大家分享一篇python實(shí)現(xiàn)小世界網(wǎng)絡(luò)生成,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-11-11