一、常見的編譯碼問題:
先來說幾個常見的問題吧。
這2個問題,都是最最常見,又最基本典型的問題,又最基本的2個問題,從這2個問題出發,弄清楚問題產生的原因,後面很多問題基本都是組合場景,能比較輕鬆解決。
二:問題產生原因分析
1、根本原因:
2、分析問題1產生原因和解決方法:
第一步: ***格式的txt檔案被讀取到記憶體中3、分析問題2產生原因和解決方法:第二步:顯示器按&&&方式來讀取?
當&&& 與 ***不一致就會亂碼,分析如下:
a: 正常預設情況下,python解析器嘗試使用 &&& = gbk格式(windows預設格式:cp396->gbk)來解析這塊記憶體資料來顯示:
a : 如果讀取的檔案是*** =gbk格式,ok,不亂碼
b : 如果讀取的檔案是*** = utf-8格式就會產生亂碼。因為以utf-8形式表示的編碼在gbk編碼中被解釋成其他字串導致產生亂碼
b: 而如果此時在在pycharm裡可以通過設定settings的encoding格式=utf-8來解析這塊記憶體資料:
a: 如果讀取的檔案是gbk格式會產生亂碼。因為以gbk形式表示的編碼在utf-8編碼中被解釋成其他字串導致產生亂碼
b : 如果讀取的檔案是utf-8格式就不會亂碼。
a.b 解決辦法:.decode(
'utf-8
').encode('
gbk')或者decode('
utf-8')
b.a 解決辦法:decode(
'gbk
').encode('
utf-8
')或者decode('
gbk'
)其中,windows預設的解析格式是gbk,在pycharm裡可以通過設定settings的encoding格式來設定;而檔案儲存格式,在notepad++可以選擇
讀取檔案推薦使用方法:
推薦使用codecs模組,
使用codecs/io.open()顯示指定檔案編碼格式。
python 2 open(filename,mode),不支援encoding引數,但python 3支援
第一步: 以***編碼格式儲存py檔案。三、其他常見不同型別問題第二步:顯示器按&&&方式來讀取?
在解析過程中,當字元在***無法找到時程式會拋異常,分析如下:
a: 正常預設情況下,python的預設編碼是 *** =ascii編碼:
a : 預設情況下,python解析器嘗試使用 &&& =gbk 來解析資料,但是中文並不是ascii字元,導致直譯器不知如何處理,拋異常.
b : 設定pycharm的settings的encoding格式 = utf-8
, 來解析資料,但是中文並不是ascii字元,導致直譯器不知如何處理,拋異常.
解決方法:宣告原始檔的編碼方式。
1、不可見字元bom導致解析異常
2、chardet檢測位元組流編碼格式,是基於概率,存在不準確的問題。位元組編碼無法準確猜對,必須明確告知
3、os.walk() 遍歷含中文的路徑時中文亂碼報錯
現在需要遍歷e:/ 下的路徑,部分如下所示,存在中文檔名
a: 報錯**段如下:讀取的
#!/usr/bin/python讀取結果如下:# -*- coding: utf-8 -*-import os
for root, dirs, files in os.walk("e:/", topdown=false):
for name infiles:
print(os.path.join(root, name))
b: 導致取讀錯誤的原因如下:
os.walk(folder_name) 返回的檔案路徑編碼和入參folder_name編碼有關:
• 當folder_name是unicode時,os.walk返回的root,directories, filenames也是unicode
• 否則按照sys.getfilesystemencoding()編碼返回str.中文windows 系統sys.getfilesystemencoding()返回「mbcs」(即:「gbk」)英文ubuntu系統sys.getfilesystemencoding()返回「utf-8」
如果根路徑中有中文,路徑需要使用unicode編碼作為os.walk的入參
c : 修改**如下,能正常讀取中文路徑
for root, dirs, files in os.walk(u"e:/", topdown=false):
或者for root, dirs, files in os.walk("
字元編碼小結
1 早期只有127以內的字元 20以內是控制字元。2 後來各國有了自己的編碼,但一般是兩個位元組表示乙個字元 中國 3 unicode 就是解決各國之間衝突的問題,定義了統一的標準。可以65025個字元。這樣英文也是乙個字元兩個位元組,這樣的好處是全世界統一。4 utf 系列其實和unicode可以...
字元編碼小結
ansi ascii american standard code for information interchange 乙個位元組 字元 0 0x32 為控制碼 33 255 為 字元 中 國人民 gb2312 去掉ascii表127之後的定義.規定 乙個小於127的字元意義與原來相同,兩個大於...
字元編碼小結
儲存器位 bit 位元組 byte 字 word 雙字 double word 1 byte 8 bits 1 word 2 bytes 16 bits 1 double word 2 words 4 bytes 32 bits 單位元組來自遠古時代。計算機最初是在美國等國家發明的,所以只需要把英文...