溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python如何利用utf-8-sig編碼格式解決寫入csv文件亂碼問題

發(fā)布時(shí)間:2021-06-17 15:12:39 來源:億速云 閱讀:912 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Python如何利用utf-8-sig編碼格式解決寫入csv文件亂碼問題,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

先舉個(gè)例子,分別以不指定編碼、指定編碼為 utf-8、指定編碼為 utf-8-sig 三種方式來做比較,再將寫入 csv 文件和 txt 文件來做個(gè)對比

一、不指定編碼方式,直接存入 csv 文件

import csv

with open('test.csv', 'w') as fp:
 writer = csv.writer(fp)
 writer.writerow(['漢語', '俄語', '韓語', '日語', '英語'])
 writer.writerow(['愛你', 'люблю тебя', '????', '愛しています', 'love you'])

此時(shí)運(yùn)行程序會報(bào)以下錯(cuò)誤:

UnicodeEncodeError: 'gbk' codec can't encode character '\uc0ac' in position 14: illegal multibyte sequence

二、指定編碼為 utf-8,再存入 csv 文件

接下來嘗試將內(nèi)容以 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'])

Python如何利用utf-8-sig編碼格式解決寫入csv文件亂碼問題

三、指定編碼為 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(['漢語', '俄語', '韓語', '日語', '英語'])
 writer.writerow(['愛你', 'люблю тебя', '????', '愛しています', 'love you'])

Python如何利用utf-8-sig編碼格式解決寫入csv文件亂碼問題

四、不指定編碼方式,直接存入 txt 文件

with open('test.txt','w') as fp:
 fp.write('愛你, люблю тебя, ????, 愛しています, love you')

和存入 csv 文件一樣,也會報(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')

Python如何利用utf-8-sig編碼格式解決寫入csv文件亂碼問題

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)識文件是采用哪種格式的編碼。

為什么寫入 csv 文件要用 utf-8-sig 編碼?

  • Excel 在讀取 csv 文件的時(shí)候是通過讀取文件頭上的 BOM 來識別編碼的,如果文件頭無 BOM 信息,則默認(rèn)按照 Unicode 編碼讀取。

  • 當(dāng)我們使用 utf-8 編碼來生成 csv 文件的時(shí)候,并沒有生成 BOM 信息,Excel 就會自動按照 Unicode 編碼讀取,就會出現(xiàn)亂碼問題了。

為什么寫入 txt 文件要用 utf-8 編碼?

在寫入 txt 文件時(shí),Windows 會默認(rèn)轉(zhuǎn)碼成 gbk,遇到某些 gbk 不支持的字符就會報(bào)錯(cuò),在打開文件時(shí)就聲明編碼方式為 utf-8 就能避免這個(gè)錯(cuò)誤。

知識點(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í),它會把BOM當(dāng)做是文件內(nèi)容來處理, 也就會發(fā)生類似上邊的錯(cuò)誤.

2、“uft-8-sig"中sig全拼為 signature 也就是"帶有簽名的utf-8”, 因此"utf-8-sig"讀取帶有BOM的"utf-8文件時(shí)"會把BOM單獨(dú)處理,與文本內(nèi)容隔離開,也是我們期望的結(jié)果.

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Python如何利用utf-8-sig編碼格式解決寫入csv文件亂碼問題”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI