利用Python從文件中讀取字符串(解決亂碼問題)


  首先聲明這篇學習記錄是基於python3的。
  python3中,py文件中默認的文件編碼就是unicode,不用像python2中那樣加u,比如u'中文'。
  不過在涉及路徑時,比如C:\Users\Administrator\Desktop\StudyNote\Python,還是要加r。
  eg:r'C:\Users\Administrator\Desktop\StudyNote\Python'。
  因為\是轉義符,想輸出'\'得寫成'\\'才可以。加了r就可以讓python自動處理字符串,不讓'\'進行轉義,因此最終的字符串就是C:\Users\Administrator\Desktop\StudyNote\Python的意思。

  OK,繼續講。
  首先要明確一點,你的py文件用什么文件編碼不重要,都可以順利執行。不過要保證一點,保存py文件時的編碼必須與編碼聲明的一樣。假設你的py文件開頭有以下編碼聲明:
  eg: # -*- coding: utf-8 -*-
  那么保存py文件時的編碼也要為utf-8。
  另外再普及一下保存文件編碼時的知識,用notepad++在選擇編碼模式的時候,有utf-8和utf-8 without BOM,這個BOM實際上是在文件開頭加注了三個字符,用以表明本文件的編碼方式為utf-8,但這個是不需要的,往往會導致讀取文件的時候出錯(因為多了三個字符嘛,如果要去掉的話還得[3:]一下,挺麻煩的)。所以我們一般用utf-8 without BOM.

  再言歸正傳。我們在處理文本文件的時候,如果該文件是unicode編碼,則不需要做任何的處理操作,直接用'r'參數讀取直接可用
  eg:

  f=open('文件路徑','r')
  f_read=f.read()
  print(f_read)

  這樣就能完整的輸出文件里的字符串。
  如果不是unicode編碼,就不能直接用了,直接讀會出現亂碼。只能先以'rb'參數讀取二進制文件的方式讀取進來,read之后再解碼
  eg:

f=open('文件路徑','rb')
f_read=f.read()
f_read_decode=f_read.decode('該文件的編碼方式')
print(f_read_decode)

  這樣才能完整顯示,不然會有亂碼出現。

  問題又來了,往往我們並不知道該文件的編碼方式,這該怎么辦?
  幸好python有個強大的工具chardet
  eg:

import chardet
f=open('文件路徑','rb')
f_read=f.read()
f_charInfo=chardet.detect(f_read)
f_charInfo的輸出是這樣的的一個字典{'confidence': 0.99, 'encoding': 'utf-8'}


  前面‘confidence’是置信概率,后面是推斷出的編碼方式。以上的結果,意思為推斷這段字符串的編碼方式為'utf-8'的概率為99%.
  經過我的測試,如果文件里的字符串比較少的話,chardet模塊是比較難判斷出正確的編碼模式的,體現在置信概率比較小,字符串多的話,概率會大。我覺得至少大於90%才可信。
  得到編碼方式后,就可以用來解碼了。
  f_read_decode=f_read.decode(f_charInfo['encoding'])
  print(f_read_decode)

  最后補充一下chardet的安裝方法:
  pip install chardet
  pip的安裝方法請自行百度。


免責聲明!

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



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