<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天真的被編碼問題一直困擾著,午休都沒進行。也真的見識到了各種編碼。例如:gbk,unicode、utf-8、ansi、gb2312等。
如果指令碼程式中編碼與檔案編碼不一致,就會報出UnicodedecodeError的錯誤。
讀檔案時常需要將內容轉為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))
解決方法:
程式碼改為:
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…
針對上面的編碼問題沒有得到很好的解決,決定專門寫一個批次將資料夾下面的檔案編碼格式改為utf-8的指令碼,網上查資料得知python的第三方模組chardet,但是要安裝這個擴充套件庫。
chardet是一個非常好的編碼識別模組,
1.chardet庫的安裝
在外網機上安裝這個模組是特表簡單的,直接執行pip chardet install命令即可,但是我的工作環境是內網,因為這個專案要處理的檔案量多且大,所以也在Windows系統(編碼問題比Linux多),因此安裝chardet模組也花費了好大一會時間。
a.在外網下載好安裝包chardet-3.0.4.tar.gz。
b.解壓縮放在python安裝路徑PythonLibsite-packages下,命令切換到當前目錄,執行python setup.py install。
c.安裝完畢後import chardet仍然未成功
上面的安裝步驟是沒有問題的,我想應該是因為某個依賴沒有安裝吧,因此突然想到一個比較笨的方法:就是在外網機上執行pip chardet install先安裝好,然後到安裝目錄下把關於chardet的安裝目錄chardet和chardet-3.0.4.dist-info拷貝到內網機PythonLibsite-packages下,再import chardet時竟然成功了。。。。
編寫檔案編碼格式轉換指令碼
#!/usr/bin/python # _*_ coding:utf-8 _*_ #更改檔案編碼,檔案統一改為utf-8無BOM格式 import os from chardet import detect #資料夾目錄 g_filedir = r'C:UsersDesktopnmgSS' 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。
針對情景2的問題,仍要繼續排查編碼的問題,根據執行的情景二的指令碼時報出的錯誤在指令碼中新增程式碼,列印出返回None的檔名。
修正程式碼
#!/usr/bin/python # _*_ coding:utf-8 _*_ #更改檔案編碼,檔案統一改為utf-8無BOM格式 import os from chardet import detect #資料夾目錄 g_filedir = r'C:UsersDesktopnmgSS' 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。
chardet模組中的chardet.detect()函數可以檢測編碼。返回結果如下:
data = '我最美'.encode('gbk') chardet.detect(data) Out[103]: {'confidence': 0.73, 'encoding': 'ISO-8859-1', 'language': ''}
輸出結果confidence為概率。
encoding為字串的編碼方式。
編碼問題最困擾人,好在今天順利解決了,各個省份的資料也都按照格式要求修改完畢,已經上報到各省份,晚上就花點時間整理以下嘍。
到此這篇關於Python UnicodedecodeError編碼問題解決方法彙總的文章就介紹到這了,更多相關Python UnicodedecodeError編碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45