最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?UnicodedecodeError編碼問題解決方法匯總

 更新時間:2022年08月18日 16:46:17   作者:tomorrownan  
本文主要介紹了Python?UnicodedecodeError編碼問題解決方法匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

今天真的被編碼問題一直困擾著,午休都沒進(jìn)行。也真的見識到了各種編碼。例如:gbk,unicode、utf-8、ansi、gb2312等。
如果腳本程序中編碼與文件編碼不一致,就會報出UnicodedecodeError的錯誤。

1.情景一

讀文件時常需要將內(nèi)容轉(zhuǎn)為utf8,文字可正常顯示,但是如果原文件內(nèi)容編碼格式不是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))

解決方法:

代碼改為:

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))

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

2.情景二

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

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

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

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

編寫文件編碼格式轉(zhuǎn)換腳本

#!/usr/bin/python
# _*_ coding:utf-8 _*_
#更改文件編碼,文件統(tǒng)一改為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)
                #格式轉(zhuǎn)換
                fileContent = fileContent.decode(encodingtype).encode('utf8')
                #寫回文件
                fileObj.seek(0)
                fileObj.write(fileContent)

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

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

此時當(dāng)前文件夾下的文件順利的進(jìn)行了讀寫,再次readlines時沒有報UnicodedecodeError問題??梢詸z測到gbk、Unicode、utf8、utf16、utf8(big)等編碼,也不用再一個編碼一個編碼的去轉(zhuǎn)換,一個文件一個文件的轉(zhuǎn)換。以為編碼問題終于一次性解決了。

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

3.情景三

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

修正代碼

#!/usr/bin/python
# _*_ coding:utf-8 _*_
#更改文件編碼,文件統(tǒng)一改為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編碼檢測結(jié)果為none
                if encodingtype==None:
                    print(filename)
                    continue
                #print(encodingtype)
                #格式轉(zhuǎn)換
                fileContent = fileContent.decode(encodingtype).encode('utf8')
                #寫回文件
                fileObj.seek(0)
                fileObj.write(fileContent)

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

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

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

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

4. chardet模塊detect()函數(shù)

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

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

輸出結(jié)果confidence為概率。

encoding為字符串的編碼方式。

編碼問題最困擾人,好在今天順利解決了,各個省份的數(shù)據(jù)也都按照格式要求修改完畢,已經(jīng)上報到各省份,晚上就花點時間整理以下嘍。

到此這篇關(guān)于Python UnicodedecodeError編碼問題解決方法匯總的文章就介紹到這了,更多相關(guān)Python UnicodedecodeError編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決python3 安裝不了PIL的問題

    解決python3 安裝不了PIL的問題

    今天小編就為大家分享一篇解決python3 安裝不了PIL的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python 的numpy庫中的mean()函數(shù)用法介紹

    python 的numpy庫中的mean()函數(shù)用法介紹

    這篇文章主要介紹了python 的numpy庫中的mean()函數(shù)用法介紹,具有很好對參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python 實現(xiàn)保存最新的三份文件,其余的都刪掉

    python 實現(xiàn)保存最新的三份文件,其余的都刪掉

    今天小編就為大家分享一篇python 實現(xiàn)保存最新的三份文件,其余的都刪掉,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 利用Python實現(xiàn)快捷操作文件和文件夾

    利用Python實現(xiàn)快捷操作文件和文件夾

    shutil是Python標(biāo)準(zhǔn)庫中的一個模塊,提供了許多用于文件和文件夾操作的高級接口,本文主要詳細(xì)介紹了Python如何使用shutil實現(xiàn)快捷操作文件和文件夾,需要的可以參考下
    2024-02-02
  • python制作爬蟲并將抓取結(jié)果保存到excel中

    python制作爬蟲并將抓取結(jié)果保存到excel中

    本文給大家記錄的是使用Python制作爬蟲爬取拉勾網(wǎng)信息并將結(jié)果保存到Excel中的實現(xiàn)思路及方法,并附上最終源碼,有需要的小伙伴可以參考下
    2016-04-04
  • 詳解python eval函數(shù)的妙用

    詳解python eval函數(shù)的妙用

    這篇文章主要介紹了詳解python eval函數(shù)的妙用,詳細(xì)介紹了python eval函數(shù)的具體用法和實例,有興趣的可以了解一下
    2017-11-11
  • python turtle庫畫一個方格和圓實例

    python turtle庫畫一個方格和圓實例

    在本篇文章里小編給大家分享了關(guān)于python中用turtle庫畫一個方格和圓實例和相關(guān)代碼,需要的朋友們可以學(xué)習(xí)參考下。
    2019-06-06
  • 解決python2.7用pip安裝包時出現(xiàn)錯誤的問題

    解決python2.7用pip安裝包時出現(xiàn)錯誤的問題

    這篇文章主要介紹了在python2.7用pip安裝包時出現(xiàn)錯誤問題的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 在Python中使用模塊的教程

    在Python中使用模塊的教程

    這篇文章主要介紹了在Python中使用模塊的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python熱重載調(diào)試新利器問題解決

    Python熱重載調(diào)試新利器問題解決

    Reloading是一個Python工具庫,它讓我們可以在每次迭代之前從源代碼中重新加載(或函數(shù))而不丟失任何當(dāng)前已執(zhí)行過程,這篇文章主要介紹了Python熱重載調(diào)試新利器,需要的朋友可以參考下
    2024-06-06

最新評論

六安市| 莱州市| 磐安县| 宝兴县| 尼木县| 准格尔旗| 铅山县| 祁东县| 阿克苏市| 天柱县| 台山市| 泗阳县| 高雄县| 综艺| 安新县| 西充县| 赣榆县| 和田市| 通城县| 邢台市| 桑植县| 曲阳县| 开江县| 龙口市| 普兰县| 洮南市| 东兰县| 临西县| 荥阳市| 汤原县| 公安县| 建瓯市| 康平县| 乐平市| 新兴县| 宝鸡市| 呼伦贝尔市| 盐源县| 台湾省| 通许县| 兴山县|