python 字節字符串上的字符串操做

問題:想在字節字符串上執行普通的文本操做(好比移除,搜索和替換)。python

解決方案程序員

1)字節字符串一樣也支持大部分和文本字符串同樣的內置操做。好比:正則表達式

>>> data = b'Hello World'
>>> data[0:5]
b'Hello'
>>> data.startswith(b'Hello')
True
>>> data.split()
[b'Hello', b'World']
>>> data.replace(b'Hello', b'Hello Cruel')
b'Hello Cruel World'

  

2)這些操做一樣也適用於字節數組。好比:數組

>>> data = bytearray(b'Hello World')
>>> data[0:5]
bytearray(b'Hello')
>>> data.startswith(b'Hello')
True
>>> data.split()
[bytearray(b'Hello'), bytearray(b'World')]
>>> data.replace(b'Hello', b'Hello Cruel')
bytearray(b'Hello Cruel World')

3)你可使用正則表達式匹配字節字符串,可是正則表達式自己必須也是字節串。編碼

>>> data = b'FOO:BAR,SPAM'
>>> import re
>>> re.split('[:,]',data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.3/re.py", line 191, in split return _compile(pattern, flags).split(string, maxsplit) TypeError: can't use a string pattern on a bytes-like object
>>> re.split(b'[:,]',data) # Notice: pattern as bytes
[b'FOO', b'BAR', b'SPAM']

 

4)大多數狀況下,在文本字符串上的操做都可用於字節字符串。然而,這裏也有一些須要注意的不一樣點。首先,字節字符串的索引操做返回整數而不是單獨字符。好比:code

>>> a = 'Hello World' # Text string
>>> a[0]
'H'
>>> a[1]
'e'
>>> b = b'Hello World' # Byte string
>>> b[0]
72
>>> b[1]
101
>>>

 

5)第二點,字節字符串不會提供一個美觀的字符串表示,也不能很好的打印出來,除非它們先被解碼爲一個文本字符串。好比:orm

>>> s = b'Hello World'
>>> print(s)
b'Hello World' # Observe b'...'
>>> print(s.decode('ascii'))
Hello World

  

6)若是你想格式化字節字符串,你得先使用標準的文本字符串,而後將其編碼爲字節字符串。好比:blog

>>> '{:10s} {:10d} {:10.2f}'.format('ACME', 100, 490.1).encode('ascii')
b'ACME 100 490.10'
>>>

  

7)最後須要注意的是,使用字節字符串可能會改變一些操做的語義,特別是那些跟文件系統有關的操做。好比,若是你使用一個編碼爲字節的文件名,而不是一個普通文本字符串,會禁用文件名的編碼/解碼。好比:索引

 

8)最後提一點,一些程序員爲了提高程序執行的速度會傾向於使用字節字符串而不是文本字符串。儘管操做字節字符串確實會比文本更加高效(由於處理文本固有的Unicode 相關開銷)。這樣作一般會致使很是雜亂的代碼。你會常常發現字節字符串並不能和Python 的其餘部分工做的很好,而且你還得手動處理全部的編碼/解碼操做。坦白講,若是你在處理文本的話,就直接在程序中使用普通的文本字符串而不是字節字符串。ci

相關文章
相關標籤/搜索