Python文本文件讀寫操作時的字符編碼問題


說明1:文本文件的字符編碼問題只存在t模式中,如:open('a.txt', mode='rt')

說明2:字符編碼詳細參考本篇博客文件操作詳細參考本篇博客

編碼(encode):

我們輸入的任何字符想要以文件(如.txt)的形式保存在計算機的硬盤上, 必須先按照一定的規則編成計算機認識的二進制后,才能存在電腦硬盤上。這種規則有GBK,utf-8等。

解碼(decode):

同理,計算機硬盤上文件,想要正確顯示在電腦屏幕上,也必須先按照一定的規則從計算機硬盤上通過解碼,把二進制數據解碼成字符,我們才能在電腦屏幕上看到。並且,如果,解碼的方式不對,就會出現亂碼。如,文件是以GBK的形式編碼的,那解碼也必須使用GBK解碼,如果使用UTF-8解碼,則會出現亂碼。

文件的讀

Python中通過open()的方式,對文本文件作讀和寫的操作

現在,我有兩個文件:

  • test1_gbk.txt
  • test2_utf-8.txt

兩者的相同點是:保存的內容相同(“中國你好”)

兩者的不同點是:test1_gbk.txt按gbk編碼保存在硬盤上,test2_utf-8按utf-8編碼保存在硬盤上

現在做個測試

測試環境:

  • win10
  • Python3.7
  • Pycharm

1,讀test1_gbk.txt

f = open('test1_gbk.txt', 'r')
s = f.read()
f.close()
print(s)

結果:你好中國

2,讀test2_utf-8.txt

f = open('test2_utf-8.txt', 'r')
s = f.read()
f.close()
print(s)

結果報錯:UnicodeDecodeError: 'gbk' codec can't decode byte 0xbd in position 14: incomplete multibyte sequence

補充:如果文件中寫的不是“你好中國”,而是其他的中文字符,可能不會報錯但會出現亂碼的現象。


為什么?

我們通過查看open() 的函數的解釋可以發現 open() 是有很多默認參數的,如,encoding

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
......
#encoding解釋如下:
encoding is the name of the encoding used to decode or encode the
    file. This should only be used in text mode. The default encoding is
    platform dependent, but any encoding supported by Python can be
    passed.  See the codecs module for the list of supported encodings.

就是說,encoding其實具有編碼和解碼的兩個功能

我的理解是:

  • 當open用來讀取文件時,encoding的作用是解碼;
  • 當open用來寫文件時,encoding的作用是編碼

另外,解碼或編碼時,encodng的默認方式到底是gbk還是UTF-8,這個取決於我們的操作系統,在windows上是默認的gbk。

因此,上面的第二個測試結果,出現報錯的提示,想要不報錯,只要添加 encoding = 'utf-8'即可

f = open('test2_utf-8.txt', 'r', encoding = 'utf-8')
s = f.read()
f.close()
print(s)

另外知道這點以后,對於test1_gbk.txt 來說,encoding = ‘gbk’ 存在與否是沒有影響的

文件的寫

  • 以上是文件的讀,文件的寫同理
  • 不同的是此時,encoding的功能是編碼
  • 通過下面的代碼創建的文件test3.txt是通過GBK的方式編碼保存的文件
f = open('test3.txt', 'w')
s = '中國你好'
f.write(s)
f.close()
  • 如果想要給你的朋友發送一個.txt文件,但是他的筆記本是蘋果的mac,你發的文件必須是ufd-8編碼的文本文件,否則對方打開是就會出現亂碼,因為mac默認的解碼是按 utf-8
  • 如果,你的筆記本也是mac,那沒有關系,因為mac默認的寫的文本文件的編碼是utf-8
  • 但如果你是windows用戶,你就必須注意。
f = open('test4.txt', 'w', encoding = 'utf-8')
s = '中國你好'
f.write(s)
f.close()
  • 在windows上,上面這種方式就創建了一個以utf-8編碼的文件 test4.txt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM