在位元組串上執行文本操作

在前面,我們學著寫了一個遞歸下降解析計算器,但如果我們想在位元組串上執行常見的文本操作,就可以這樣:

>>> data = bHello World
>>> data[0:5]
bHello
>>> data.startswith(bHello)
True
>>> data.spilt()

實際上,位元組串已經支持大多數和文本字元串一樣的內建操作,類似這樣的操作也可以在數組上面完成。我們可以在字元串上執行正則表達式的模式匹配操作,但是模式本身需要以位元組串的形式來指定。大多數情況而言,幾乎所有的能在文本字元串上執行的操作同樣也可以在位元組串上進行。但是還是有點區別需要注意一下:

>>> a = Hello
>>> a[0]
H
>>> a[1]
e
>>> b = bHello
>>> b[0]
72
>>> b[1]
101
>>>

注意到沒有,位元組字元串輸出的是數字而不是字元。這種語義上的差別會對試圖按照字元的方式處理面向位元組流數據的程序帶來影響。並且,位元組串並沒有提供一個漂亮的字元串表示,除非我們在輸出前首先將其解碼為文本字元串,並且,在位元組串上是沒有普通字元串那樣的格式化操作的。也就是說,如果你想在位元組串上做任何形式的格式化操作,你應該使用普通的文本字元串然後再重新編碼。

下面是全部代碼:

import re

def byte_str():
data = bHello World
print(data[0:5])
print(data.startswith(bHello))
print(data.split())
print(data.replace(bHello, bHello Cruel))

# 位元組數組
data = bytearray(bHello World)
print(data[0:5])
print(data.startswith(bHello))
print(data.split())
print(data.replace(bHello, bHello Cruel))

# 正則式
data = bFOO:BAR,SPAM
print(re.split(b[:,],data))

# 位元組字元串列印不美觀
s = bHello World
print(s)
print(s.decode(utf-8))

print({:10s} {:10d} {:10.2f}.format (ACME, 100, 490.1).encode(ascii))

if __name__ == __main__:
byte_str()

第二章完成!

參考書目

《Python CookBook》作者:【美】 David Beazley, Brian K. Jones

Github地址:

yidao620c/python3-cookbook?

github.com圖標
推薦閱讀:

相关文章