將一個py腳本從Centos轉到win運行,出錯如下:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence
雖然明白是編碼的問題,網絡上decode()什么的,貌似不適用python3。后來發現使用字節方式打開可以。出錯函數如下:gridfs.GridFS.put()函數。其中調用了讀寫操作
If you want raw bytes then you need to open it in binary mode.
pipe = open('/dev/input/js0','rb')
附上一篇關於python編碼的帖子
1. pyhton的所有內置庫、方法接受的是unicode編碼的字符串。
2. str.decode 函數就是轉成unicode編碼,所以能decode的字符串傳進python的內置庫、函數都能正確運行。
3.問題在於這個decode函數解碼時到底要傳哪個參數:utf-8,gbk,gb2312......等N種編碼。參數不當,就會拋類似異常:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data
下面舉個例子:
- #coding:utf-8
- #指定本文件編碼為utf8
- import os
- # 以下為示例代碼,不一定能運行。隨意寫的,無編譯運行過。
- # 例子以XP平台為例,因為linux平台編碼(UTF-8)與window平台(GBK)不一樣。
- # 假設D盤下面有很多中文名稱文件
- filelist = os.listdir(r"d:\\") # 此處返回的list中的中文是以GBK編碼的,你可以通過查看cmd窗口屬性看到。
- for path in filelist:
- if os.path.isdir(path): continue
- fp = open(path.decode("GBK") , 'rb') # 如果此處用 path.decode("UTF-8") 就會拋異常,原因是wind的dir命令返回的是GBK編碼
- print len(fp.read())
- fp.close()
- filepath =r"d:\\中文文件.doc" # 假設此文存在,記得要帶中文
- fp = open(filepath.decode('utf-8'), "rb") #這里使用utf8參數進行解碼,原因是文件頭里有句coding: utf-8
- print len(fp.read())
- fp.close()
- path2 = u"d:\\中文文件.doc" # 假如這里有個u在前面,這個變量就是unicode編碼了,不用解碼。
- fp = open(path2, 'rb')
- print len(fp.read())
- fp.close()
