1. 程式人生 > >關於資料處理使用python時出現的各種編碼問題的解決方案

關於資料處理使用python時出現的各種編碼問題的解決方案

關於python中出現的各種編碼問題
  • 首先,windows下複製檔案的絕對路徑時請絕對不要使用屬性->安全中的直接複製,因為這樣做有時候會引入額外的不可見字元。請按下shift鍵的同時點選右鍵,會有一項是“複製為路徑”,點選這個項就可以得到一個帶雙引號的絕對檔案路徑
  • 另外,簡介一下.encode()和.decode()兩個函式的用法。python內部執行時使用的都是unicode,但是問題是有時候有的檔名或某些檔案的內容是使用其他方式編碼的,所以要用這兩個函式來把它們變成unicode。一個非unicode的內容要變成unicode,需要解碼(decode)為unicode,而unicode格式的內容要輸出時需要編碼(encode)為其他的編碼格式。
  • 另外,注意每一個python檔案第一行都要寫上`#-*-coding:utf-8-*-`,表示這個py‘檔案的編碼格式是utf8。這裡的編碼格式的意思是作為檔案,它存貯的時候使用的編碼格式。
  • 字串前面直接加u表示用unicode儲存,而加r表示
  • python的預設編碼是ascii碼,而如果要想把預設編碼方式變為utf8,可以用下述的方法:
可以在Python安裝目錄下的Lib/site-packages目錄中,新建一個sitecustomize.py檔案(也可以建在其它地方,然後手工匯入,建在這裡,每次啟動Python的時候設定自動生效),內容如下: import sys sys.setdefaultencoding('utf-8') #set default encoding to utf-8 想要看到效果(是否已經生效): import syssys.getdefaultencoding()
  • open(filename, 'w')這個方法中,filename這個引數必須是Unicode編碼的引數
  • u’字串’ 代表是unicode格式的資料,路徑最好寫成這個格式,別直接跟字串’字串’這類資料相加,相加之後type就是str,這樣就會存在解碼失誤的問題。
  • 有些讀取的方式偏偏是要讀取str型別的路徑,不是unicode型別的路徑,那麼我們把這個str.encode(‘utf-8’)就可以了,儲存到txt中也這樣處理,因為儲存到txt中,中文也得先轉成utf-8格式的字串。
  • 有個神妙的問題是:你在程式碼中用中文初始化出來的字串是utf-8的,但是python自動生成的字串是unicode的。另外像是資料庫這種地方,它的資料格式又不一定,要先驗證。
  • 一個變數中放了一箇中文字串,如x="中",那麼直接打x回車後控制檯輸出的是其編碼,比如'\xca\xc2',而打print x則會返回“中”
  • 陣列或是元組等初始化時候,如果涉及到漢字,一定要在引號前面加u,如:x=[u"在",u"中"] ,因為檔案儲存時候的編碼型別是utf-8,所以要是直接在程式碼中初始化中文,千萬注意要在引號前面加u。
  • Python中的編碼問題,Python中的字串的大概分為為str和Unicode兩種形式,其中str常用的編碼型別為utf-8,gb2312,gbk等等,Python使用Unicode作為編碼的基礎型別。str記錄的是位元組陣列,只是某種編碼的儲存格式,終於輸出到檔案或是打印出來是什麼格式,完全取決於其解碼的編碼將他解碼成什麼樣子;Unicode是一種類似於符號集的抽象編碼,它只規定了符號的二進位制程式碼,卻沒有規定這個二進位制程式碼該如何儲存,也就是它只是一種內部表示,不能直接儲存,所以儲存時需要規定一種儲存形式,比如utf-8等。
  • string-escape和unicode-escape:
  1. string-escape是對二進位制的位元組流,一個位元組一個位元組轉義,並對每個位元組以16進位制輸出;unicode-escape是對unicode編碼的位元組流,兩個位元組兩個位元組轉義,並對每兩個位元組一起以16進位制輸出。
  2. unicode <-> utf8/gbk <-> string-escape;unicode <-> unicode-escape
  • 從下圖可見,python中存貯的是沒有轉義的純字元,即\\,而print之後就已經轉義過了。只有一個\
Python讀取中文路徑時的處理 把程式中的unicode形式的內容寫到txt中的方式 舉例如下: writeToPos = unicode(r"D:\_Desktop_temp\機器學習\需求分析\所有問題種類.txt") writeTo = open(writeToPos,"w+") setTable = list(set(table.col_values(ord('C')-ord('A')))) strSetTable = str(setTable).replace('u\'','\'') strSetTable = strSetTable.replace(',','\n') writeTo.write(strSetTable.decode('unicode-escape'))
  • 總結:先用unicode(r"file_path")或是ur"file_path"獲取unicode格式的正確檔案地址,再用open()開啟,最後使用write或是writeline函式寫入檔案,記住如果要寫入的內容是一個單純的unicode字串,則可以直接在輸出的時候encode成utf-8就好啦,但是如果是一個list或是一個set等,這時候由於像是u'/\u552e\u53d1\u8ba2\u5355#\u673a\u5668\u4eba'這樣的格式的內容有許多,並且用","隔開,所以我們要使用如下方式:
  1. 將原list/set轉換為字串(用str()函式)
  2. 將1中的結果用.replace('u\'','\'')的方式把u單引號換成單引號,即刪掉單引號前面的u
  3. 輸出的時候使用2中的結果.decode('unicode-escape')
list、set等的轉碼處理
  • 由於list、set等無法直接encode和decode,所以可以用以下的方法解決:
setTable = list(set(table.col_values(ord('C')-ord('A')))) strSetTable = str(setTable).replace('u\'','\'') strSetTable = strSetTable.replace(',','\n')