如何在 Python 2 和 Python 3 中將位元組轉換為字串

Jinku Hu 2023年1月30日 2019年12月6日
  1. 在 Python 2.x 中將位元組轉換為字串
  2. 在 Python 3.x 中將位元組轉換為字串
  3. Python 位元組轉換為字串的不同方法的效能比較和結論
如何在 Python 2 和 Python 3 中將位元組轉換為字串

我們將來介紹將如何在 Python 2.x 和 Python 3.x 中將 bytes 轉換為字串。

在 Python 2.x 中將位元組轉換為字串

Python 2.7 中的 bytes 等同於 str,因此 bytes 變數本身就是字串。

Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
'cd'
>>> type(A)
<type 'str'>

在 Python 3.x 中將位元組轉換為字串

bytes 是 Python 3 中引入的新資料型別。

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
b'cd'
>>> type(A)
<class 'bytes'>
>>> 

bytes 中的元素的資料型別為 int

>>> A = b'cd'
>>> A[0]
99
>>> type(A[0])
<class 'int'>

在 Python 3.x 中通過 decode 將位元組轉換為字串

bytesdecode 方法可以使用給定的 encoding 將位元組轉換為字串。在大多數情況下,如果將 encoding 方法沒有被指定,那預設設定是 utf-8。但它並非總是安全的,因為位元組可以使用其他的不同於 utf-8 的編碼方法進行編碼。

>>> b'\x50\x51'.decode()
'PQ'
>>> b'\x50\x51'.decode('utf-8')
'PQ'
>>> b'\x50\x51'.decode(encoding = 'utf-8')
'PQ'

如上所示,三種對 bytes 的解碼方式得到的結果相同,因為它們都是用 utf-8 作編碼方法。

如果 bytes 不是用 utf-8 編碼,但你用 utf-8 解碼的話,系統會報 UnicodeDecodeError 錯誤。

>>> b'\x50\x51\xffed'.decode('utf-8')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    b'\x50\x51\xffed'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid start byte

我們有兩種方法可以解決此類 encoding 問題。

backslashreplace, ignore 或者 replace 作為 errors 的引數

decodeencoding 外,還有另一個引數 errors。它定義了 error 事件發生時的行為。預設值 errorsstrict,這意味著如果在解碼過程中發生錯誤,則會丟擲錯誤。

error 還有其他選項,如 ignorereplace 或其他註冊的 codecs.register_error 名稱,比如 backslashreplace

ignore 忽略錯誤的解碼錯誤,並儘可能建立輸出字串。

replaceencoding 給定方法中定義的字元替換相應的字元。backslashreplace 用與原始 bytes 內容相同的內容替換無法解碼的字元。

>>> b'\x50\x51\xffed'.decode('utf-8', 'backslashreplace')
'PQ\\xffed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'ignore')
'PQed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'replace')
'PQ�ed'

如果 bytes 資料的編碼未知,則可以使用 MS-DOS cp437 編碼。

>>> b'\x50\x51\xffed'.decode('cp437')
'PQ\xa0ed'

在 Python 3.x 中用 chr 將位元組轉換為字串

chr(i, /) 返回一個包含一個序號的字元的 Unicode 字串,它可以將 bytes 的單個元素轉換為 string,而不是轉換整個 bytes

我們可以使用列表推導或 map,用 chr 來獲取 bytes 單個元素轉換成的字元,從而得到整個轉換後的字串。

>>> A =  b'\x50\x51\x52\x53'
>>> "".join([chr(_) for _ in A])
'PQRS'
>>> "".join(map(chr, A))
'PQRS'

Python 位元組轉換為字串的不同方法的效能比較和結論

我們用 timeit 來比較本教程中介紹的方法- decodechr 的效能。

>>> import timeit
>>> timeit.timeit('b"\x50\x51\x52\x53".decode()', number=1000000)
0.1356779
>>> timeit.timeit('"".join(map(chr, b"\x50\x51\x52\x53"))', number=1000000)
0.8295201999999975
>>> timeit.timeit('"".join([chr(_) for _ in b"\x50\x51\x52\x53"])', number=1000000)
0.9530071000000362

從上面顯示的時間效能中可以看出,decode() 它要比 chr() 快得多。chr() 效率相對較低,因為它需要從單個字串字元中重建字串。

我們建議在效能重要的應用程式中使用 decode

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - Python Bytes

相關文章 - Python String