亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Python?UnicodedecodeError編碼問題如何解決

發布時間:2022-08-26 14:54:47 來源:億速云 閱讀:147 作者:iii 欄目:開發技術

這篇文章主要介紹“Python UnicodedecodeError編碼問題如何解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python UnicodedecodeError編碼問題如何解決”文章能幫助大家解決問題。

1.情景一

讀文件時常需要將內容轉為utf8,文字可正常顯示,但是如果原文件內容編碼格式不是utf8就會報錯UnicodedecodeError。如下:

問題:

try:
     fileObj = open(os.path.join(path,filename),'r')
       textLines = fileObj.readlines()
       fileObj.close()
   except IOError as err:
       print('打開文件%s失敗:%s'%(filename,err))

Python?UnicodedecodeError編碼問題如何解決

解決方法:

代碼改為:

try:
     fileObj = open(os.path.join(path,filename),'r',encoding='utf-8')
       textLines = fileObj.readlines()
       fileObj.close()
   except IOError as err:
       print('打開文件%s失敗:%s'%(filename,err))

此方法可以解決一部分編碼問題,但是卻不是一勞永逸的,在下一批文件因其他功能擴展需要讀寫時,上面程序又報出UnicodedecodeError:gbk codec cant decode…

2.情景二

針對上面的編碼問題沒有得到很好的解決,決定專門寫一個批量將文件夾下面的文件編碼格式改為utf-8的腳本,網上查資料得知python的第三方模塊chardet,但是要安裝這個擴展庫。
chardet是一個非常好的編碼識別模塊,

1.chardet庫的安裝
在外網機上安裝這個模塊是特表簡單的,直接執行pip chardet install命令即可,但是我的工作環境是內網,因為這個項目要處理的文件量多且大,所以也在Windows系統(編碼問題比Linux多),因此安裝chardet模塊也花費了好大一會時間。

a.在外網下載好安裝包chardet-3.0.4.tar.gz。
b.解壓縮放在python安裝路徑\Python\Lib\site-packages下,命令切換到當前目錄,執行python setup.py install。
c.安裝完畢后import chardet仍然未成功

上面的安裝步驟是沒有問題的,我想應該是因為某個依賴沒有安裝吧,因此突然想到一個比較笨的方法:就是在外網機上執行pip chardet install先安裝好,然后到安裝目錄下把關于chardet的安裝目錄chardet和chardet-3.0.4.dist-info拷貝到內網機\Python\Lib\site-packages下,再import chardet時竟然成功了。。。。

Python?UnicodedecodeError編碼問題如何解決

編寫文件編碼格式轉換腳本

#!/usr/bin/python
# _*_ coding:utf-8 _*_
#更改文件編碼,文件統一改為utf-8無BOM格式
import os
from chardet import detect

#文件夾目錄
g_filedir = r'C:\Users\Desktop\nmg\SS'

def runcoding(path):
    for filename in os.listdir(path):
        if filename.endswith('.txt'):
            with open(os.path.join(path,filename),'rb+') as fileObj:
                fileContent = fileObj.read()
                #判斷編碼格式
                encodingtype = detect(fileContent)['encoding']
               
                print(encodingtype)
                #格式轉換
                fileContent = fileContent.decode(encodingtype).encode('utf8')
                #寫回文件
                fileObj.seek(0)
                fileObj.write(fileContent)

if __name__=="__main__":
    runcoding(g_filedir)

在處理字符串時,常常會遇到不知道字符串是何種編碼,如果不知道字符串的編碼就不能將字符串轉換成需要的編碼。上面的chardet模塊就能很好的解決這個問題。

此時當前文件夾下的文件順利的進行了讀寫,再次readlines時沒有報UnicodedecodeError問題。可以檢測到gbk、Unicode、utf8、utf16、utf8(big)等編碼,也不用再一個編碼一個編碼的去轉換,一個文件一個文件的轉換。以為編碼問題終于一次性解決了。

但是。。。到另一個省份的一批文件要進行批量操作時,進行到第49個文件就終止了,又報出UnicodedecodeError:‘utf8’ codec cant decode問題。。。。用上面腳本對該省份文件夾下文件進行格式轉換時報出錯誤:TypeError:decode() argument 1 must be str ,not None。

3.情景三

針對情景2的問題,仍要繼續排查編碼的問題,根據運行的情景二的腳本時報出的錯誤在腳本中添加代碼,打印出返回None的文件名。

修正代碼

#!/usr/bin/python
# _*_ coding:utf-8 _*_
#更改文件編碼,文件統一改為utf-8無BOM格式
import os
from chardet import detect

#文件夾目錄
g_filedir = r'C:\Users\Desktop\nmg\SS'

def runcoding(path):
    for filename in os.listdir(path):
        if filename.endswith('.txt'):
            with open(os.path.join(path,filename),'rb+') as fileObj:
                fileContent = fileObj.read()
                #判斷編碼格式
                encodingtype = detect(fileContent)['encoding']
                #ansi編碼檢測結果為none
                if encodingtype==None:
                    print(filename)
                    continue
                #print(encodingtype)
                #格式轉換
                fileContent = fileContent.decode(encodingtype).encode('utf8')
                #寫回文件
                fileObj.seek(0)
                fileObj.write(fileContent)

if __name__=="__main__":
    runcoding(g_filedir)

然后定位到那個文件,記事本打開再另存為查看編碼方式為ANSI,或者使用notpad++查看編碼類型。

記事本默認是以ANSI編碼保存文本文檔的,而正是這種編碼存在的bug招致了上述怪現象。假如保存時選擇Unicode、Unicode (Big Endian)、UTF-8編碼,就正常了。此外,假如以ANSI編碼保存含有某些特別符號的文本文檔,再次打開后符號也會變成英文問號。

這里可以得知,文件以ansi編碼時decode()函數返回的事None。

4. chardet模塊detect()函數

chardet模塊中的chardet.detect()函數可以檢測編碼。返回結果如下:

data = '我最美'.encode('gbk')
chardet.detect(data)
 
Out[103]: {'confidence': 0.73, 'encoding': 'ISO-8859-1', 'language': ''}

輸出結果confidence為概率。

encoding為字符串的編碼方式。

關于“Python UnicodedecodeError編碼問題如何解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

祁东县| 勃利县| 策勒县| 台前县| 澄江县| 康定县| 肇庆市| 昭平县| 清新县| 同江市| 水城县| 迭部县| 夏津县| 海晏县| 诸城市| 九江县| 互助| 巴彦淖尔市| 彩票| 高要市| 治多县| 无棣县| 蒙山县| 车险| 大洼县| 昌乐县| 遂宁市| 焉耆| 通许县| 内黄县| 翁牛特旗| 昭觉县| 乌兰县| 双峰县| 平远县| 大埔县| 赣榆县| 延庆县| 察雅县| 凤台县| 拜城县|