python str與bytes之間的轉換

2021-09-24 04:57:46 字數 1594 閱讀 7491

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來作資料傳輸的單位,因為物理層,資料鏈路層的傳輸對於使用者是透明的,而這種通訊傳輸是基於二進位制的傳...