python獲取文件編碼
『壹』 python 讀寫文件的編碼與解碼問題
演示文件為docx文檔,內容如下:
運行源碼查看報錯信息
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 15: illegal multibyte sequence
上述錯誤是一種很常見的解碼錯誤,下面介紹該錯誤的解決方法
把utf-8,gbk等各種編碼方式都試了一遍,還是沒有解決問題然後仔細看報錯信息,根據UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfb in position 14: invalid start byte,猜測文件中某個位元組不能解碼,打開文件一看,並沒有看出什麼問題來
open() 函數的第三個參數不是用來野唯接收編碼方式的,而磨脊信是傳入一個buffering的值,此處傳入了'gbk'字元串,所以系統提示傳一個瞎輪整型
通過調用office的API進行操作,因為在office上能完成的操作,都能通過win32完成,所以我們選擇使用win32
(Python3.5 需要安裝 win32compat,裡面含了 win32 的很多包)
『貳』 python讀取文件解決『utf8』 codec can』t decode byte 0xa1的問題
一般這種文件存在類似字元:
如果UTF-8搞不定,可以採取ISO-8859-1編碼方式解決:
最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現了很多標准編碼,重要的有如下幾個。
很明顯,iso8859-1編碼表示的字元范圍很窄,無法表示中文字元。但是,由於是單位元組編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用iso8859-1編碼來表示。而且在很多協議上,默認使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是"d6d0 cec4"兩個字元,使用iso8859-1編碼的時候則將它拆開為4個位元組來表示:"d6 d0 ce c4"(事實上,在進行存儲的時候,也是以位元組為單位處理的)。而如果是UTF編碼,則是6個位元組"e4 b8 ad e6 96 87"。很明顯,這種表示方法還需要以另一種編碼為基礎。
需要說明的是,定長編碼便於計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字元,所以在很多軟體內部是使用unicode編碼來處理的,比如java。
注意,雖然說utf是為了使用更少的空間而使用的,但那隻是相對於unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個位元組,但即使對於漢字網頁,utf編碼也會比unicode編碼節省,因為網頁中包含了很多的英文字元。
『叄』 python中如何獲取中文的utf8編碼
首先要表示一個漢字,至少需要2個位元組碼
如果需要以utf解碼你的漢字,可以用如下辦法
>>>unicode('人','utf-16')
u'ucbc8'
如果需要以gbk解碼你的漢字,可以用如下辦法
>>>unicode('人','gbk')
u'u4eba
『肆』 Python怎麼獲取HDFS文件的編碼格式
你好,你可以利用python3的python3-magic來獲得文件的編碼格式。下面是對應的代碼
import magic
blob = open('unknown-file').read()
m = magic.open(magic.MAGIC_MIME_ENCODING)
m.load()
encoding = m.buffer(blob) # "utf-8" "us-ascii" etc
『伍』 Python中讀取二進制圖片(例如 a.jpg)有關解碼編碼的問題
binascii.hexlify估計能滿足你的要求。不過不建議把二進制數據用編解碼來處理,因為編解碼只是文本採用了不同的編碼方案。而圖像這些二進制有自己的含義,文本編解碼方案不應該用在這些二進制文件上。s就是你的數據,你也別想看懂,除非你知道jpg格式。
『陸』 Python:查看文件的編碼格式-chardet
其中, encoding 為檢測出的編碼, confidence 為可信度, language 是語言。
另外一個例子:
檢測的編碼是GB2312,注意到GBK是GB2312的超集,兩者是同一種編碼,檢測正確的概率是74%,language欄位指出的語言是'Chinese'。
注意:chardet支持檢測的編碼列表請參考官方文檔 Supported encodings 。
『柒』 python123漢字的unicode編碼值
python的默認編碼是ascii,可以通過sys.setdefaultencoding('utf-8')函數設置python的默認編碼。
python中可以通過encode和decode的方式改變數據的編碼,比如:
>>> u'漢字'
u'\u6c49\u5b57'
>>> u'漢字'.encode('utf-8')
'\xe6\xb1\x89\xe5\xad\x97'
>>> u'漢字'.encode('utf-8').decode('utf-8')
u'\u6c49\u5b57'
我們可以通過這兩個函數設置編碼。
那麼,python中的str是什麼類型?
>>> import binascii
>>> '漢字'
'\xba\xba\xd7\xd6'
>>> type('漢字')
>>> print binascii.b2a_hex('漢字')
babad7d6
>>> print binascii.b2a_hex(u'漢字')
Traceback (most recent call last):
File "", line 1, in
UnicodeEncodeError: 'ascii' codec can't encode characters in
position 0-1: ordinal not in range(128)
>>> print binascii.b2a_hex(u'漢字'.encode('utf-8'))
e6b189e5ad97
>>> print binascii.b2a_hex(u'漢字'.encode('gbk'))
babad7d6
binascii是將數據的二進制轉換成ascii,上面的解釋是:『漢字'的類型是str,二進制是babad7d6,u『漢字'是無法轉換成ascii,這樣就報出了開頭的第一個錯誤。解決辦法就是把它.encode(『utf-8')成str類型。因為我命令行是windows默認的GBK編碼,所有u'漢字'.encode(『gbk')的時候,輸出結果和『漢字'結果一樣。
『捌』 python輸出到文件亂碼如何解決
python代碼文件的編碼
py文件默認是ASCII編碼,中文在顯示時會做一個ASCII到系統默認編碼的轉換,這時就會出錯:SyntaxError: Non-ASCII character。需要在代碼文件的第一行或第二行添加編碼指示:
1 # coding=utf-8 ##以utf-8編碼儲存中文字元
2 print '中文'
像上面那樣直接輸入的字元串是按照代碼文件的編碼來處理的,如果用unicode編碼,有以下三種方式:
1 s1 = u'中文' #u表示用unicode編碼方式儲存信息
2 s2 = unicode('中文','gbk')
unicode是一個內置函數,第二個參數指示源字元串的編碼格式。
decode是任何字元串具有的方法,將字元串轉換成unicode格式,參數指示源字元串的編碼格式。
encode也是任何字元串具有的方法,將字元串轉換成參數指定的格式。
(2)、字元串的編碼
用 u'漢字' 構造出來的是unicode類型,不用的話構造出來是str類型
str的編碼是與系統環境相關的,一般就是sys.getfilesystemencoding()得到的值
所以從unicode轉str,要用encode方法
從str轉unicode,所以要用decode
例如:
# coding=utf-8 #默認編碼格式為utf-8
s = u'中文' #unicode編碼的文字
print s.encode('utf-8') #轉換成utf-8格式輸出
但當python中間處理非ASCII編碼時,經常會出現如下錯誤:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128)
0x??是超出128的數字,python在默認的情況下認為語言的編碼是ascii編碼,所以無法處理其他編碼,需要設置python的默認編碼為所需要的編碼。
一個解決的方案是在代碼中添加:
import sys
reload(sys)
sys.setdefaultencoding('utf-8') (其中utf-8為你想輸出的字元編碼)
解釋:
sys.setdefaultencoding方法在python導入site.py後就刪除了(具體代碼查看site.py就可以看到)因此如果想用的話可以再重新load進入
總結:
u=u'unicode編碼文字'
g=u.encode('gbk') #轉換為gbk格式
print g #此時為亂碼,因為當前環境為utf-8,gbk編碼文字為亂碼
str=g.decode('gbk').encode('utf-8') #以gbk編碼格式讀取g(因為他就是gbk編碼的,需要事先知道它是GBK編碼)並轉換為utf-8格式輸出
print str #正常顯示中文(同文件輸出)
安全的方法:
s.decode('gbk','ignore').encode('utf-8′) #以gbk編碼讀取(當然是讀取gbk編碼格式的文字了)並忽略錯誤的編碼,轉換成utf-8編碼輸出。
推薦學習《Python教程》!