遇到一個線上問題,需要通過pingback分析用戶的行為。數據組提供一份相關用戶的pingback文件用於分析。但是看pingback文件太痛苦了,於是就想編寫一個腳本處理一下,對針對其中的參數值,替換成其代表的中文含義,方便查看。
需求由於pingback的log信息都是記錄在linux端的,通常非桌面環境的linux版本都不支持中文顯示,因此導出來的pingback中帶的中文也是非中文的。中文的顯示也是類似這種形式:\xE7\xAD\x89\xE4\xBD\xA0\xE5\x8C\x85\xE5\x85\xBB\xE6\x88\x91,為了方便閱讀,需要把這種類型的字符轉化為中文
實現過程想要實現這個需求,總共有以下兩個過程:
明確這是啥字符?
怎麼還原這種字符為中文?
一、這是啥字符 ?經過一番搜索調研,找到這麼一種解釋?
linux默認使用utf-8編碼,而utf-8默認以unicode字符集進行的編碼,此種格式其實是一種utf-8的字節碼[bytes]。如果要還原,需要對其進行utf-8解碼
這次知道是啥了,那就知道要怎麼處理了,python中有很多方法可以編碼、解碼,於是開始第二個過程
二、怎麼還原成中文?python 3中對字符編碼方面,進行了很大的改進,默認採用了unicode字符集並使用utf-8進行編碼。而且轉換方法很靈活。於是開始實驗:
>>> a = '\xE6\x96\xB0'
>>> a.decode('utf-8')Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'str' object has no attribute 'decode'似乎有點異常,提示 str 類型沒有decode方法。如上文所說,我們是要對bytes類型的字節碼進行解碼。但提示卻是str類型,看來是犯了一個低級錯誤:我們視覺上看到的只是格式上的字節碼,但實際上它是str類型
>>> type(a)<class 'str'>所以我們要先把str轉為bytes類型
>>> s = bytes(a, encoding='utf-8')
>>> sb'\xc3\xa6\xc2\x96\xc2\xb0'好像還有問題,我希望的結果是內容不變,只是把str類型改為bytes類型,但現在結果內容也變了。說明使用bytes()方法進行強制轉換是不行的。繼續在網上查找,發現str的內建encode方法中可以做到保留字符串本身的轉義字符的意義,也就是\x。再次實驗:
>>> s = a.encode('raw_unicode_escape')
>>> s b'\xe6\x96\xb0'
>>> type(s) <class 'bytes'>這次成功了,繼續之前的解碼
>>> s.decode('utf-8')'新'已經可以成功的還原成了中文,試試混合其它字符的
>>> m = 'searchResultType=111&word=\xe6\x96\xb0'
>>> m.encode('raw_unicode_escape').decode('utf-8')'searchResultType=111&word=新'Perfect,下面就是具體的封裝成函數,方便調用了
def get_chinese(str_like_bytes):
return str_like_bytes.encode('raw_unicode_escape').decode('utf-8')到此,問題看來是解決了。下面就是編輯腳本,打開文件,找出要解碼的部分調用方法就可以了