2013-10-08 43 views
0

在Python中,我想要字節字符串來處理一些8位字符串。我發現字符串不是像字符串那樣需要的行爲。隨着標,它返回一個數字,而不是長度的字節串1Python 3字節字符串訂閱

In [243]: s=b'hello' 

In [244]: s[1] 
Out[244]: 101 

In [245]: s[1:2] 
Out[245]: b'e' 

這使得它真的很難,當我重複它。例如,此代碼使用字符串,但字節串失敗。

In [260]: d = {b'e': b'E', b'h': b'H', b'l': b'L', b'o': b'O'} 

In [261]: list(map(d.get, s)) 
Out[261]: [None, None, None, None, None] 

這打破了Python 2的一些代碼。我也發現這種不規則性真的不合情理。任何人都有什麼洞察字節串是怎麼回事?

回答

0

字節字符串存儲0-255範圍內的字節值。字節的repr只是方便查看它們,但它們存儲的是數據而不是文本。觀察:

>>> x=bytes([104,101,108,108,111]) 
>>> x 
b'hello' 
>>> x[0] 
104 
>>> x[1] 
101 
>>> list(x) 
[104, 101, 108, 108, 111] 

將字符串用於文本。如果用字節開始,他們適當地進行解碼:

>>> s=b'hello'.decode('ascii') 
>>> d = dict(zip('hello','HELLO')) 
>>> list(map(d.get,s)) 
['H', 'E', 'L', 'L', 'O'] 

但是如果你想用字節來工作:

>>> d=dict(zip(b'hello',b'HELLO')) 
>>> d 
{104: 72, 108: 76, 101: 69, 111: 79} 
>>> list(map(d.get,b'hello')) 
[72, 69, 76, 76, 79] 
>>> bytes(map(d.get,b'hello')) 
b'HELLO'