1. 程式人生 > >python編碼錯誤:UnicodeDecodeError: 'utf8' codec can't decode

python編碼錯誤:UnicodeDecodeError: 'utf8' codec can't decode

這個是在寫hive的map指令碼時遇到的,基本情況如下:

map檔案中呼叫了其他同學的公用函式,在hive指令碼中執行時,輸出報錯。但是,如果單獨執行python,並輸出到檔案,就沒有錯誤了,感覺異常的詭異,其中hive報錯如下:

Traceback (most recent call last):
File “search_map_script_py”, line 114, in
dataStreamProcess(line)
File “search_map_script_py”, line 108, in dataStreamProcess
print ‘%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s’ % (pbrand, ptype, psize, res, softv, organic, appfrom, searchtype, cuid, search_tm)
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 5: ordinal not in range(128)

於是在map指令碼中新增sys模組,設定了輸出的環境為utf8:

import sys
reload(sys)
sys.setdefaultencoding(‘utf-8’)

但是,初步的問題解決後,不部分時間指令碼執行正常,但是,時而出錯。單獨執行python,並輸出到文字,一切正常。其中hive指令碼報錯如下:

Traceback (most recent call last): File “searchBox_user_map_script_py”, line 212, in dataStreamProcess(line) File “user_map_script_py”, line 201, in dataStreamProcess print ‘%s\t%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s’ % (baiduapp_uid, imei, actionType, os, os_ver, net, resolution,event_country,event_province,event_city,softv,app_from, loc_country, loc_province, loc_city, phoneBrand, phoneType, phoneSize, netOper, year, month, day, tstamp) UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0x80 in position 25: invalid start byte

以上問題出現後,糾結了大概一週左右,借下面博主的文章,順利解決:

print ‘%s\t%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s’ % (baiduapp_uid, imei, actionType, os, os_ver, net, resolution,event_country,event_province,event_city,softv,app_from, loc_country, loc_province, loc_city, unicode(phoneBrand).encode(‘utf-8’), unicode(phoneType).encode(‘utf-8’), phoneSize, netOper, year, month, day, tstamp

其中,之前已經判斷出錯欄位為phoneBrand, phoneType。

——————–以下為博主原文—————————–

【已解決】Python指令碼語法錯誤:SyntaxError: (unicode error) ‘utf8’ codec can’t decode byte 0xc0 in position 0: invalid start byte

【背景】

一個python指令碼,執行的時候出錯了:

D:\tmp\WordPress\Others\to_wp\hi-baidu-mover_v2>hi-baidu-mover_v2011-12-22-office.py -fhttp://hi.baidu.com/recommend_music/blog/item/de233143bd84211a72f05deb.html -l 1
File “D:\tmp\WordPress\Others\to_wp\hi-baidu-mover_v2\hi-baidu-mover_v2011-12-22-office.py”, line 869
cat_no_unicode = opt_no_unicode.replace(u’類別:’, ”)
SyntaxError: (unicode error) ‘utf8’ codec can’t decode byte 0xc0 in position 0: invalid start byte

【解決過程】

1.覺得很奇怪的一點是,這個指令碼,一直是可以正常執行的,怎麼突然就出現了語法錯誤了。

然後發現是帶有中文的程式碼,會出現錯誤。

第一反應是,可能是安裝了那個python的Python Imaging Library (PIL)庫,然後影響了當前的python 2.7.2版本的語法了,影響成為類似於python 3.x的語法了。

因為之前試過,python 3.x版本中,對於上述寫法,即u加上中文,比如:

u‘這是中文’,是不支援的。而python 2.x的語法是支援的,表示這個字元是unicode的字元,會自動處理編碼,成為unicode變數的。

所以,就是嘗試了,解除安裝掉之前安裝的PIL-1.1.7.win32-py2.7.exe,結果問題依舊。

2.對應著當前這個python指令碼,之前還有一個版本,裡面也有同樣的這部分程式碼,結果卻是,那個指令碼可以正常執行,這個指令碼無法執行,出現這個SyntaxError: (unicode error)錯誤,所以更加異怪了。

本來想找個beyondcompare來比較兩個指令碼之前到底有哪些區別的,結果由於暫時不方便下載安裝使用beyondcompare,只好作罷。

3.重新安裝了python 2.7.2,問題依舊。

4.重啟電腦,問題依舊。

5.後來,把上述程式碼中中文字元字首的u,改為函式unicode加上中文字元,即:

cat_no_unicode = opt_no_unicode.replace(unicode(‘類別:’), ”)

結果,就可以正常執行了,沒有了這個語法錯誤。

6.然後才突然想到,是不是指令碼檔案本身的編碼不匹配,一去檢視當前所用的notepad++中的當前指令碼檔案所用的編碼,果然,用的是預設的ANSI,而不是utf-8的編碼,所以,u”類別:”,無法識別,而 去notepad+中,格式->轉為utf-8編碼,後,再儲存檔案,再去執行指令碼,就可以支援u”類別:”了。

當然,對應的unicode(“類別:”)這樣的做法,起始是最安全的,其不會受到你當前python指令碼檔案所用編碼的影響。

【總結】

1。如果python中所要處理的字串中包含中文,那麼最好要搞懂所用字元的編碼,是gbk/gb2312/gb18030,還是utf-8,否則容易出現亂碼,以及此處的語法錯誤。

而為了保險起見,最好用unicode(“中文字元”)的方式,來使用,操作這些中文字元。

當然,如果你自己需要,自己也知道,那最好unicode(“中文字元”).encode(“utf-8”)的方法,把其轉為utf-8的格式,這個編碼最通用。

2.notepad++新建的檔案,也最好使用比較通用的utf-8的格式來儲存檔案,而不要用預設的ANSI,否則其中的中文,會由於ANSI不支援,而預設用你本地語言,比如我此處的GBK,去編碼,這樣容易出現一些編碼類的錯誤。

【後記1】

本來覺得上面的理解是完全正確的。

結果證實了,上面的理解,是錯誤的。。。

實際的例子是:

如果用unicode(“下午”).encode(“utf-8”),然後python指令碼可以執行通過,但是結果卻不對,無法和我從網頁中抓取到的utf-8的“下午“相匹配,導致程式碼執行結果不是我們想要的。

而只有通過u”下午“.encode(“utf-8”)得到的結果,才和我網頁中抓取到的utf-8的”下午“相等,程式碼才可以按照預期的結果去執行。

所以,結論是:

【總結】

1.python指令碼檔案所用編碼,如果可以,最好用utf-8.

2.指令碼中,用到的中文字元,具體是unicode(”中文“).encode(“utf-8”),還是u”中文”.encode(“utf-8”),你要自己嘗試,才知道結果如何。至少我這裡的,是後者,程式執行結果才是對的。

【後記2】

1.經過測試:

此處我從網頁抓取的中文字元moring_afternoon_zhCN,isinstance(moring_afternoon_zhCN, unicode)的結果,是False,即不是unicode字元。和之前介紹的,網頁內容被beautifulsoup處理後,就自動轉為utf-8這點,所不一致了。暫未搞懂是啥原因。

而且實際一個是utf-8的字元和這個字元比較:

    afternoon_zhCN_utf8 = u"下午".encode("utf-8")

    #if unicode(moring_afternoon_zhCN).encode("utf-8") == afternoon_zhCN_utf8:

    if unicode(moring_afternoon_zhCN).encode("utf-8") == unicode("下午").encode("utf-8") :  # this line can not excute!!!

        hour = str(int(hour) + 8) 

結果也會出錯的:

File “D:\tmp\WordPress\Others\to_wp\hi-baidu-mover_v2\hi-baidu-mover_v2011-12-22-office.py”, line 1169, in parseAndSetEntryDatetime

if unicode(moring_afternoon_zhCN).encode("utf-8") == unicode("涓嬪崍").encode("utf-8") :  # this line can excute, but result is worng !!!

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)

  1. 上面的isinstance(u”下午”.encode(“utf-8”), unicode)結果為False,即不是unicode字元,這點需要注意一下的。因為本身u”下午”是unicode字元,屬於unicode型別,被轉換編碼encode(“utf-8”)後,就是普通的字元,屬於str型別了。

相關推薦

python編碼錯誤UnicodeDecodeError: 'utf8' codec can't decode

這個是在寫hive的map指令碼時遇到的,基本情況如下: map檔案中呼叫了其他同學的公用函式,在hive指令碼中執行時,輸出報錯。但是,如果單獨執行python,並輸出到檔案,就沒有錯誤了,感覺異常的詭異,其中hive報錯如下: Traceback (mo

python】-- 安裝 xadmin錯誤"UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 3444"

在學習 Django 時,需要安裝 xadmin ,結果出現了一下錯誤 C:\WINDOWS\system32>pip install xadmin Collecting xadmin

Python各種錯誤UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 33: ordinal not in

錯誤起因: 為Python2.7安裝ez_setup.py。 所報錯誤: UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in pos

python 字元編碼與解碼——unicode、str和中文UnicodeDecodeError: 'ascii' codec can't decode

摘要:在進行python指令碼的編寫時,如果我們用python來處理網頁資料或者進行與中文字元有關的處理工作,經常出現這樣的出錯資訊:SyntaxError: Non-ASCII character '\xe6' in file ./filename.py on line

python 安裝scrapy錯誤提示UnicodeDecodeError: 'ascii' codec can't decode byte 解決方案

應該是出了編碼問題,谷歌了一下找到了解決方案:在python的Lib\site-packages資料夾下新建一個sitecustomize.py: import sys sys.setdefaultencoding('gb2312') 搞定,就是這麼簡單!

python 編碼問題 UnicodeDecodeError: ‘utf8codec cant decode byte 0xb4 in position 0: invalid start byt

心好累呀,作為一個菜鳥,進了銀行實習,銀行還沒有網路,不能查詢,只能靠自己的流量;而且銀行也不能將檔案輸入輸出,造成了我更加懵逼的狀態。腳還扭傷了,兩週沒有去,進度更不上。 windows配spark的環境老不行,問題也不能解決。等會把問題抄一下吧 先把編碼的問題寫上來

Python報錯UnicodeDecodeError: ‘gbk‘ codec cant ...

代碼 seq new error ltib utf byte pen osi python讀取文件時提示:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaa in position 82: illegal multi

[python]解決Windows下安裝第三方外掛報錯UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0:

系統:win10 IDE:pycharm Python版本:2.7 安裝第三方外掛是報錯: 報錯原因與編碼有關,pip把下載的臨時檔案存放在了使用者臨時檔案中,這個目錄一般是C:\Users

python問題UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position

使用febootstrap時碰到這個錯誤 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 經過搜尋,發現應該是因為python2.x的預設編碼是ascii,而程式碼中可能由utf-8

python執行時出現UnicodeDecodeError: 'gbk' codec can't decode byte 0x89 in position 14: illegal ...的解決辦法

在python第四次實驗作業時: python在讀取檔案時出現“UnicodeDecodeError: 'gbk' codec can't decode byte 0x89 in position 14: illegal multibyte sequence”錯誤 翻譯為

UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 0: i報錯問題

在網上搜了很多人的處理方法是在程式的頂部加 import sys reload( sys ) sys.setdefaultencoding('gbk') 可是我自己試一了,程式錯是不報了,但是實際沒有執行 最後,我在程度的頂部加了下面兩行就好了,中文也可以正常顯示了

解決UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c

問題 with open(file, 'rb') as f: for raw_line in f: # process 但是我在執行時會報TypeError錯誤: TypeError: sequence

使用Robot Framework執行時後臺報錯UnicodeDecodeError:'utf8' codec can't decode byte

使用Robot Framework進行自動化測試,執行時遇到 UnicodeDecodeError :'utf-8' codec can't decode byte 0xd0 in position 46:invalid continuation byte 如下方法可

python | 讀檔案編碼問題 | UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 34: illegal mu

python 讀取文字檔案,報出gbk問題 問題如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in positio

python 讀取資料出現UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid contin

之前寫程式時也出現過類似錯誤,每次解決了到第二次遇見又忘了具體方法,這次記錄一下。 一、字元編碼問題 先介紹一下字元編碼問題 1.ASCLL與GB2312 由於計算機是美國人發明的,因此,最早只有127個字元被編碼到計算機裡,也就是大小寫英文字母、數字和一些符號,這個

Python3解決問題讀取檔案時,出現亂碼或者“UnicodeDecodeError 'gbk' codec can't decode錯誤

使用的電腦系統:Windows 10 64位 使用的開發整合環境:Anaconda3 使用的Python的版本:python 3.5.2 出現的錯誤 讀取檔案時,出現亂碼或者UnicodeDecodeError: 'gbk' codec can't decode byt

Python中SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: ***錯誤

前幾天一直在對檔案的寫入、刪除等操作學習,但是複製檔案的路徑一直報錯對檔案操作不了,所以一直把檔案複製到pychrome當前專案的目錄中使用,現在總結下怎麼使用非當前目錄下的檔案。 fh=logging.FileHandler("C:\Users\huang\Pycharm

Python3 編碼問題UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f621' in posit

錯誤描述及分析 最近跑程式遇到一個很神奇的問題,程式在輸出的時候,前面都是正常的,但是中間同樣的code在執行的時候卻報錯: UnicodeEncodeError: ‘ascii’ codec can’t encode character ‘\U0001f6

fool.load_userdict(path)出現編碼檔案出錯,UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position

錯誤問題:UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 34: illegal multibyte sequence 解決方法:           解決辦法1          

字串繼續編碼UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in rang

dd_/root>cat a2.py import commands import MySQLdb condition='20.2.224.26' conn= MySQLdb.connect( host='127.0.0.1', por