python str與bytes之間的轉換
# bytes object
b = b"example"
# str object
s = "example"
# str to bytes
sb = bytes(s, encoding = "utf8")
# bytes to str
bs = str(b, encoding = "utf8")
# an alternative method
# str to bytes
sb2 = str.encode(s)
# bytes to str
bs2 = bytes.decode(b)
字串編碼一直是令人非常頭疼的問題,尤其是我們在處理一些不規範的第三方網頁的時候。雖然python提供了unicode表示的str和bytes兩種資料型別,並且可以通過encode()和decode()方法轉換,但是,在不知道編碼的情況下,對bytes做decode()不好做。
對於未知編碼的bytes,要把它轉換成str,需要先「猜測」編碼。猜測的方式是先收集各種編碼的特徵字元,根據特徵字元判斷,就能有很大概率「猜對」。
當然,我們肯定不能從頭自己寫這個檢測編碼的功能,這樣做費時費力。chardet這個第三方庫正好就派上了用場。用它來檢測編碼,簡單易用。
安裝chardet
如果安裝了anaconda,chardet就已經可用了。否則,需要在命令列下通過pip安裝:
$ pip install chardet
如果遇到permission denied安裝失敗,**上sudo重試。
使用chardet
當我們拿到乙個bytes時,就可以對其檢測編碼。用chardet檢測編碼,只需要一行**:
>>> chardet.detect(b'hello, world!')
檢測出的編碼是ascii,注意到還有個confidence欄位,表示檢測的概率是1.0(即100%)。
我們來試試檢測gbk編碼的中文:
>>> data = '離離原上草,一歲一枯榮'.encode('gbk')
>>> chardet.detect(data)
檢測的編碼是gb2312,注意到gbk是gb2312的超集,兩者是同一種編碼,檢測正確的概率是74%,language欄位指出的語言是'chinese'。
對utf-8編碼進行檢測:
>>> data = '離離原上草,一歲一枯榮'.encode('utf-8')
>>> chardet.detect(data)
我們再試試對日文進行檢測:
>>> data = '最新の主要ニュース'.encode('euc-jp')
>>> chardet.detect(data)
可見,用chardet檢測編碼,使用簡單。獲取到編碼後,再轉換為str,就可以方便後續處理。
chardet支援檢測的編碼列表請參考官方文件supported encodings。
小結使用chardet檢測編碼非常容易,chardet支援檢測中文、日文、韓文等多種語言。
python str與repr的區別
repr 輸出對 python比較友好,而str 的輸出對使用者比較友好。雖然如此,很多情況下這三者的輸出仍然都是完全一樣的 儘管str repr 和 運算在特性和功能方面都非常相似,事實上repr 和 做的是完全一樣的事情,它們返回的是乙個物件的 官方 字串表示,也就是說絕大多數情況下可以通過求值...
Bytes 與 String 的區別
python3中最重要的新特性可能就是將文字 text 和二進位制資料做了更清晰的區分。文字總是用unicode進行編碼,以str型別表示 而二進位制資料以bytes型別表示。在python3中,不能以任何隱式方式將str和bytes型別二者混合使用。不可以將str和bytes型別進行拼接,不能在s...
bytes與bits的前世今生
1kb 1024bytes 8196bits bit意為 位 或 位元 是計算機運算的基礎,屬於二進位制的範籌 byte意為 位元組 是計算機檔案大小的基本計算單位 這兩者應用的場合不同。通常用bit來作資料傳輸的單位,因為物理層,資料鏈路層的傳輸對於使用者是透明的,而這種通訊傳輸是基於二進位制的傳...