2010-04-07 341 views
69

在Python源代碼,我偶然發現我已經看到了小b一個字符串之前像:python字符串之前的b前綴是什麼意思?

b"abcdef" 

我瞭解u前綴標誌着一個Unicode字符串,以及r原始字符串文字的前綴。

b是什麼意思,在哪種類型的源代碼中很有用,因爲它似乎完全像沒有任何前綴的普通字符串?

+10

@SLott:按照您提供的鏈接,您會看到b前綴爲** not ** allowed in字符串前綴... for 2.6(看起來像參考資料中的一個小錯誤)。搜索這些東西並不容易。我嘗試了像「b python string prefix」這樣的關鍵字,並且基本上都沒有。 – kriss 2010-04-08 05:42:23

+0

S.Lott使用的鏈接缺少版本說明符;這是關於Python 3的:https://docs.python.org/3/reference/lexical_analysis.html#string-literals。現在,[Python 2.6及更高版本](https://docs.python.org/2/whatsnew/2.6.html#pep-3112-byte-literals)也支持該前綴,以促進跨版本的Python代碼。 – 2014-06-07 16:04:36

+1

這個問題既不是「完全重複」,也不是「我可以在我的印刷聲明中擺脫這個'b'字符的問題的答案嗎?」 http://stackoverflow.com/questions/42599851/can-i-get-rid-of-this-b-character-in-my-print-statement/42599902#42599902你介意取消標記,請marijin?詢問的人以及實際嘗試答案的人可能會喜歡能夠回答所提出的實際問題。 – 2017-03-06 06:54:43

回答

43

這是Python3 bytesliteral。這個前綴在Python 2.5和更舊的版本中是不存在的(它相當於2.x的普通字符串,而3.x的普通字符串相當於在2.x中有u前綴的文字)。在Python 2.6+中,它等價於一個普通字符串for compatibility with 3.x

+0

@WRAR:在python 2.6代碼中我看到了這個,好像是在python2.6中引入的 – kriss 2010-04-07 14:00:31

+0

我特意在2.6的參考文件中對它進行了檢查:http://docs.python.org/reference/lexical_analysis.html#literals – wRAR 2010-04-07 14:02:30

+1

好吧,「爲了將來的兼容性,Python 2.6將字節作爲str類型的同義詞,並且它還支持b''符號。」,來自「新功能」。 – wRAR 2010-04-07 14:05:47

55

b前綴表示bytes string literal

如果您看到它在Python 3源代碼中使用,則表達式會創建一個bytes object,而不是常規的Unicode str object。如果您看到它在您的Python shell中回顯或作爲列表,字典或其他容器內容的一部分回顯,那麼您會看到一個使用此表示法表示的bytes對象。

bytes對象基本上包含一系列範圍在0-255之間的整數,但在表示時,Python會將這些字節顯示爲ASCII代碼點,以便更易於閱讀其內容。 ASCII字符範圍外的任何字節都顯示爲轉義序列(例如,\n,\x82等)。

由於bytes對象包括整數的序列的,可以在0-255範圍構建從整數的任何其他序列的bytes對象與值,比如一個列表:

bytes([72, 101, 108, 108, 111]) 

bytes模型二進制數據,包括編碼文本。如果您的bytes值確實包含文本,則需要先使用正確的編碼解碼器對其進行解碼。如果數據被編碼爲UTF-8,例如,你可以得到一個Unicode str值有:

strvalue = bytesvalue.decode('utf-8') 

相反,從文本到去一個str對象,你需要編碼bytes。您需要決定要使用的編碼;默認是使用UTF-8,但你需要的是高度依賴於你的使用情況:

bytesvalue = strvalue.encode('utf-8') 

您也可以使用構造,做同樣的。

解碼和編碼方法都對specify how errors should be handled採取額外的參數。

Python 2,版本2.6和2。7還支持使用b'..'字符串文字語法創建字符串文字,以簡化在Python 2和3上都可以使用的代碼。

相關問題