簡體   English   中英

當字節對象顯然僅包含字符時,將Python 3個字節對象轉換為字符串

[英]Converting Python 3 bytes object to string when bytes object apparently only contains characters

我是Python 3的新手,看來我不能完全掌握unicode和字符編碼。

我正在使用另一個工具的輸出,該工具以字節對象的形式返回html頁的內容。 我們使用的其他工具需要此輸出為字節類型,但是,我想將字節輸出轉換為字符串,以便進行一些分析和與其他字符串的比較。 對於我感興趣的情況,打印輸出字節對象僅顯示字符,而不顯示\\ x或\\ u二進制文件。 我對如何最好地做到這一點以及為什么創建所需輸出的方法真正起作用感到困惑。

我在其他地方讀過,在這種情況下應該使用.decode(),它確實起作用,但是我不明白為什么我要解碼已經是字符的對象。 據我了解,解碼是針對二進制數的,例如:

>>> b'\x41'.decode('utf-8')
'A'

以我的理解,我真正想要做的就是告訴Python,被標記為字節類型對象的對象實際上是str對象。 簡單地在字節對象上使用str()函數也可以實現此目標,但是添加“ b”前綴並在字符串周圍添加引號。

這是我正在使用的兩個解決方案:

>>> str(b'htmltext')
"b'htmltext'"

>>> b'htmltext'.decode('utf-8')
'htmltext'

從本質上講,這些解決方案中的任何一個似乎都可以實現我想要的功能,但是從我閱讀的內容來看,decode()顯然更干凈,並且推薦的方法。 我想知道為什么解碼()起作用,因為顯然我沒有將二進制數字轉換為字符。 此外,除了輸出中不引人注意的“ b”和引號之外,還有什么其他理由認為str()在這里不是有效的解決方案嗎?

不要將bytes對象的開發人員友好表示與其中包含的數據混淆。 兩種方式都有二進制數據。

通過顯示恰好是該ASCII字符的有效ASCII代碼點(而不是\\xhh轉義代碼)的內容,開發人員的表示使您可以輕松查看其中包含的內容。 以這種方式讀取以ASCII編碼的文本更容易,並且世界上許多文本碰巧都是ASCII編碼的。

但是,當數據不在ASCII范圍內時,您將遇到困難:

>>> 'Åæøéï'.encode('utf8')
b'\xc3\x85\xc3\xa6\xc3\xb8\xc3\xa9\xc3\xaf'

這是一個帶重音符號的UTF-8字節序列編碼文本。 上面的內容可能有些虛構,但是大多數非英語文本將包括一些非ASCII文本。 甚至英文文本也可以包含短划線或引號,並且其b'...'字節版本的可讀性不如正確解碼的文本版本高:

>>> '“Kragerø” is a town in Norway – in the province of Vestfold'.encode('utf8')
b'\xe2\x80\x9cKrager\xc3\xb8\xe2\x80\x9d is a town in Norway \xe2\x80\x93 in the province of Vestfold'

注意b'....'輸出是在bytes對象上使用repr()函數的結果; 調用object.__repr__()方法 ,該方法具有顯式功能,可以為您生成對開發人員友好的字符串。 bytes對象上沒有專用的object.__str__()方法 ,即使使用str()函數,也將調用__repr__方法。 bytes 轉換為字符串的正確方法是解碼(對數據使用正確的編解碼器)。

當然,當您擁有表示其他內容的二進制數據(例如,圖像數據)時,請將其保留為bytes 那里沒有要解碼的文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM