1. 程式人生 > 程式設計 >Python利用 utf-8-sig 編碼格式解決寫入 csv 檔案亂碼問題

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(['漢語','love you'])

在這裡插入圖片描述

三、指定編碼為 utf-8-sig,再存入 csv 檔案

當將編碼方式換成 utf-8-sig 之後,顯示為正常:

import csv

with open('test.csv',encoding='utf-8-sig') as fp:
 writer = csv.writer(fp)
 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',encoding='utf-8') as fp:
  fp.write('愛你,love you')

with open('test.txt',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 檔案亂碼問題,希望對大家有所幫助,也非常感謝大家對我們網站的支援!