亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Python3 str(bytes) 轉換為文字字符串 b'<str>'

為什么 Python3 str(bytes) 轉換為文字字符串 b'<str>'

慕尼黑8549860 2023-04-11 15:18:50
我正在使用 python3。以下是解釋問題的示例。# python3Python 3.6.8 (default, Sep 26 2019, 11:57:09) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import sys>>> sys.getdefaultencoding()'utf-8'>>> help(str) |  str(object='') -> str |  str(bytes_or_buffer[, encoding[, errors]]) -> str |   |  Create a new string object from the given object. If encoding or |  errors is specified, then the object must expose a data buffer |  that will be decoded using the given encoding and error handler. |  Otherwise, returns the result of object.__str__() (if defined) |  or repr(object). |  encoding defaults to sys.getdefaultencoding(). |  errors defaults to 'strict'.>>> d = b'abcd'>>> type(d)<class 'bytes'>>>> print(d)b'abcd'>>> len(d)4>>> m = str(d)>>> type(m)<class 'str'>>>> print(m)b'abcd'>>> len(m)7>>> m.encode()b"b'abcd'">>> >>> m = str(d, encoding='utf-8')>>> type(m)<class 'str'>>>> print(m)abcd>>> len(m)4>>> 在幫助(str)中提到“編碼默認為 sys.getdefaultencoding()”仍然 str(d)轉換帶有 b'' 的字符串。注意字符串的長度現在是 7。問題是,為什么需要明確指定默認編碼才能從字節中生成正確的字符串如何回到字節 - 新類型是字符串。(對字符串進行編碼將添加額外的 b)有沒有辦法讓 pylint 捕捉/警告這個問題。
查看完整描述

4 回答

?
慕后森

TA貢獻1802條經驗 獲得超5個贊

str()for與is forbytes相同,正是因為您最終不會濫用它。這是一個更復雜的示例,其中源字符串是表情符號。repr()bytes


>>> s = "??"

>>> len(s)

1  # One codepoint.

>>> b = s.encode("utf-8")

>>> len(b)

4  # Four bytes.

>>> print(b)

b'\xf0\x9f\x98\xb8'  # Repr of the bytes, not to be interpreted.

>>> print(repr(b))

b'\xf0\x9f\x98\xb8'  # Same as above!

>>> s2 = b.decode("utf-8")  # Decode back to string from bytes.

>>> s == s2

True

>>>

也就是說,使用str.encode()從字符串中獲取字節,bytes.decode()從字節中獲取字符串。


查看完整回答
反對 回復 2023-04-11
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

您不是將其用作轉換函數(如在 C 和 C++ 中),而是將其用作值的str字符串表示形式(要打印,因此它可能與 不同)。repr()

問題是二進制數組沒有好的可打印字符串,所以我假設沒有特定的str()函數,所以它退回到repr(),它添加了一些額外的注釋(對于開發人員),比如前綴b'。

在不知道編碼的情況下,Python 無法將二進制數據轉換為字符串。(二進制編碼aASCII0x61中,字符串被解碼a表示a)。

所以你可能想要d.decode('utf-8')。

注意:系統編碼是另一回事。它用于終端輸入和輸出,但不用于二進制數組,或從磁盤讀取的一般數據。


查看完整回答
反對 回復 2023-04-11
?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

有沒有辦法讓 pylint 捕捉/警告這個問題


我認為 pylint 不會捕捉到它,但如果您愿意在代碼中添加類型注釋,mypy 會捕捉到它。


如果使用 flag 執行實例, Python 將在實例str上調用時發出警告。bytes-b


$ python3 -b -c 'str(b"a")'

-c:1: BytesWarning: str() on a bytes instance

請注意,警告只發出一次,AFAICT。


如果使用 執行-bb,將引發異常。


python3 -bb -c 'str(b"a")'

Traceback (most recent call last):

  File "<string>", line 1, in <module>

BytesWarning: str() on a bytes instance


查看完整回答
反對 回復 2023-04-11
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

如果指定了編碼 [..],則對象必須公開一個數據緩沖區,該緩沖區將使用給定的編碼 [..] 進行解碼。object.__str__()否則,返回(如果已定義)或的結果repr(object)。

這幾乎可以回答您的問題。如果您省略encoding參數,則repr(object)使用,這將導致"b'...'"作為結果字符串值。如果您確實提供了encoding參數,那么它將嘗試使用該編碼解碼提供的對象。這是兩個根本不同的操作:

  1. 生成對象的字符串表示形式,這是非常安全的,不會真的失敗。

  2. 解碼二進制對象,即嘗試以某種方式解釋其內容,這很可能會失敗。

這兩個操作由兩種不同的函數調用方式表示str。當您只希望執行 #1 時,您不希望隱式觸發變體 #2 并有潛在的錯誤條件來處理一些隱式設置的全局值。


查看完整回答
反對 回復 2023-04-11
  • 4 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號