Python2.7中文編碼問題

一峦嗤、背景描述

開發(fā)環(huán)境:python2.7院水,spyder腊徙。

問題:行為評分卡做模型監(jiān)控(樣本外驗證),對驗證月份數據集進行數據分箱檬某,中文類變量無法正確判斷是否相同撬腾,導致數據分箱錯誤。

示例:教育程度變量(尰帜眨科民傻,本科,碩士)场斑,由于中文比較一致錯誤漓踢,導致變量分箱均分到了最后一組碩士。

初步分析:在建模過程中做測試漏隐、驗證集的分箱未發(fā)生此問題喧半,因此懷疑主要是在數據持久化的時候pickle(模型及數據字典的保存)、pandas(dataframe基礎數據)對數據的編碼方式存在差異青责。

解決思路:py2本身對中文支持不友好薯酝,由于編碼不同所以導致同一中文在py2中判斷一致性時判斷為False,那么決定在讀取數據后爽柒,對數據統一為同一編碼格式是最簡單的吴菠。(修改源代碼、研究那兩庫會消耗更多時間浩村,不劃算)做葵。

吐槽:原始代碼的作者和團隊負責人都不太靠譜,其實就我們的應用場景而言心墅,python3完全可以滿足酿矢,遷移也很簡單榨乎,不過剛好也想搞明白python的編碼機制,那就這樣吧瘫筐。

二蜜暑、python2的編碼原理

參考文章:https://www.cnblogs.com/liaohuiqiang/p/7247393.html

參考文章說的非常詳細,不贅述策肝,這里總結幾個自己覺得比較重要的點:

1肛捍、通過chardet檢查自己數據的編碼類型,方便后續(xù)轉碼

示例:chardet.detect(df['char_apply_education_info'][0])

2之众、默認中文編碼格式:py2:utf-8拙毫,py3:unicode,其中py2默認使用ascii碼讀取源文件棺禾,所以程序文件開始還需聲明:# encoding=utf8缀蹄。

據說py2中在字符串前加u可以轉換為unicode編碼,不過我沒太搞明白對我的用處膘婶。

還有個據說缺前,設置sys的setdefaultencoding('utf8'),影響print輸出格式悬襟,其中有篇文章做了很詳細的分析衅码,我覺得也沒啥用。

import sys

reload(sys)

sys.setdefauleencoding('utf8')

3古胆、py2編碼的順序(后續(xù)解決問題的關鍵)

str -> decode(根據指定編碼格式解碼) -> unicode -> encode(根據指定編碼格式編碼) -> str

py2中比較字符串時肆良,如果A是unicode而B不是筛璧,那么將對B使用系統默認編碼進行解碼逸绎。

三、問題解決方法

思路想清楚了其實很簡單夭谤,分兩步:

1棺牧、選取df中的object類變量做編碼轉換(注意先處理空值,不然會報錯朗儒,空值沒有decode方法)

示例:str(type(df['char_apply_education_info'])) == '''<type 'numpy.string_'>'''

應該是有更好的方法做類型判斷颊乘,比如pandas自帶的select等方法,項目時間有限醉锄,就先解決問題了乏悄。

2、查看數據編碼格式差異恳不,然后轉換為同一種編碼格式

示例:df['char_apply_education_info'][0].decode('gb2312').encode('utf8')

其中檩小,gb2312是df的編碼格式,utf8是model通過pickle讀取到內存后的編碼格式烟勋。

至于為什么轉換df而不轉換model规求,是因為在我這這么操作更方便筐付,不能一概而論,但道理上是這樣的阻肿,同一編碼即可瓦戚。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丛塌,隨后出現的幾起案子较解,更是在濱河造成了極大的恐慌,老刑警劉巖姨伤,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哨坪,死亡現場離奇詭異,居然都是意外死亡乍楚,警方通過查閱死者的電腦和手機当编,發(fā)現死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徒溪,“玉大人忿偷,你說我怎么就攤上這事‰冢” “怎么了鲤桥?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長渠概。 經常有香客問我茶凳,道長,這世上最難降的妖魔是什么播揪? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任贮喧,我火速辦了婚禮,結果婚禮上猪狈,老公的妹妹穿的比我還像新娘箱沦。我一直安慰自己,他們只是感情好雇庙,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布谓形。 她就那樣靜靜地躺著,像睡著了一般疆前。 火紅的嫁衣襯著肌膚如雪寒跳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天竹椒,我揣著相機與錄音童太,去河邊找鬼。 笑死,一個胖子當著我的面吹牛康愤,可吹牛的內容都是我干的儡循。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼征冷,長吁一口氣:“原來是場噩夢啊……” “哼择膝!你這毒婦竟也來了?” 一聲冷哼從身側響起检激,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤肴捉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叔收,有當地人在樹林里發(fā)現了一具尸體齿穗,經...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年饺律,在試婚紗的時候發(fā)現自己被綠了窃页。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡复濒,死狀恐怖脖卖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情巧颈,我是刑警寧澤畦木,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站砸泛,受9級特大地震影響十籍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜唇礁,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一勾栗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垒迂,春花似錦械姻、人聲如沸妒蛇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绣夺。三九已至吏奸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陶耍,已是汗流浹背奋蔚。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泊碑。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓坤按,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馒过。 傳聞我的和親對象是個殘疾皇子臭脓,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內容

  • 字符集和編碼簡介 在編程中常常可以見到各種字符集和編碼腹忽,包括ASCII,MBCS,Unicode等字符集来累。確切的說...
    蘭山小亭閱讀 8,464評論 0 13
  • python編碼錯誤和中文的亂碼問題,研究了整整兩天窘奏,查閱了很多資料嘹锁,也走了一些彎路,我把經驗寫下着裹,讓新手少走點彎...
    adminlzzs閱讀 3,445評論 0 4
  • 幾個基本概念 bit二進制位领猾, 是計算機內部數據儲存的最小單位,11010100是一個8位二進制數骇扇。一個二進制位只...
    西電大俠閱讀 3,562評論 1 8
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,448評論 0 13
  • http://python.jobbole.com/85231/ 關于專業(yè)技能寫完項目接著寫寫一名3年工作經驗的J...
    燕京博士閱讀 7,557評論 1 118