官术网_书友最值得收藏!

2.9 字節(jié)字符串操作

在實(shí)際工作中,我們有時(shí)需要對字節(jié)字符串執(zhí)行如移除、搜索和替換等普通的文本操作。

字節(jié)字符串支持大部分和文本字符串一樣的內(nèi)置操作,相關(guān)代碼(str_operation.py)示例如下:


test_str = b'Hello World'
print(test_str[0: 5])
print(test_str.startswith(b'Hello'))
print(test_str.split())
print(test_str.replace(b'World', b'Python'))

執(zhí)行py文件,輸出結(jié)果如下:


b'Hello'
True
[b'Hello', b'World']
b'Hello Python'

這些操作同樣適用于字節(jié)數(shù)組,相關(guān)代碼(str_operation.py)示例如下:


test_list = bytearray(test_str)
print(test_list[0: 5])
print(test_list.startswith(b'Hello'))
print(test_list.split())
print(test_list.replace(b'World', b'Python'))

執(zhí)行py文件,輸出結(jié)果如下:


bytearray(b'Hello')
True
[bytearray(b'Hello'), bytearray(b'World')]
bytearray(b'Hello Python')

我們可以使用正則表達(dá)式匹配字節(jié)字符串,但是正則表達(dá)式本身必須是字節(jié)串,示例如下:


data = b'FOO:BAR,SPAM'
import re
re.split('[:,]',data) # error
re.split(b'[:,]',data)

大多數(shù)情況下,在文本字符串上的操作均可用于字節(jié)字符串。不過有一些需要注意的點(diǎn),首先字節(jié)字符串的索引操作返回的是整數(shù)而不是單獨(dú)字符,相關(guān)代碼(str_operation.py)示例如下:


a = 'Hello World'
print(f'str result:{a[0]}')
print(f'str result:{a[1]}')

b = b'Hello World'
print(f'binary result:{b[0]}')
print(f'binary result:{b[1]}')

執(zhí)行py文件,輸出結(jié)果:


str result:H
str result:e
binary result:72
binary result:101

這種語義上的區(qū)別對處理面向字節(jié)的字符數(shù)據(jù)有影響。

其次,字節(jié)字符串不會提供一個(gè)美觀的字符串表示,也不能很好地打印出來,除非它們先被解碼為一個(gè)文本字符串,示例如下:


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

類似地,字節(jié)字符串也不存在任何適用于字節(jié)字符串的格式化操作:


print(b'{} {} {}'.format(b'ACME', 100, 490.1))
print(f"{b'ACME'} {100} {200.5}'")

如想格式化字節(jié)字符串,得先使用標(biāo)準(zhǔn)的文本字符串,然后將其編碼為字節(jié)字符串,示例如下:


print(f"{'ACME':10s} {100:10d} {200.5:10.2f}'".encode('ascii'))

最后需要注意的是,使用字節(jié)字符串可能會改變一些操作的語義,特別是那些與文件系統(tǒng)有關(guān)的操作。如使用一個(gè)編碼為字節(jié)的文件名,而不是一個(gè)普通的文本字符串,會禁用文件名的編碼/解碼,示例(str_operation.py)如下:


with open('jalape\xf1o.txt', 'w') as f:
    f.write('spicy')

import os
os.listdir('.')
os.listdir(b'.')

注意例子中的最后部分給目錄名傳遞一個(gè)字節(jié)字符串是怎樣導(dǎo)致結(jié)果中文件名以未解碼字節(jié)返回的。在目錄中的文件名包含原始的UTF-8編碼。

最后提一點(diǎn),一些程序員為了提升程序執(zhí)行的速度會傾向于使用字節(jié)字符串而不是文本字符串。

盡管操作字節(jié)字符串確實(shí)會比文本更加高效(因?yàn)樘幚砦谋竟逃械腢nicode相關(guān)開銷),但這樣做通常會導(dǎo)致代碼非常雜亂。在應(yīng)用中,我們經(jīng)常會發(fā)現(xiàn)字節(jié)字符串并不能和Python的其他部分工作得很好,并且還得手動處理所有的編碼/解碼操作。

如果要處理的是文本,我們可直接在程序中使用普通的文本字符串而不是字節(jié)字符串。

主站蜘蛛池模板: 灵山县| 隆林| 广水市| 新乡县| 宾阳县| 治多县| 黑龙江省| 内乡县| 镇安县| 佳木斯市| 封开县| 格尔木市| 大渡口区| 甘泉县| 刚察县| 航空| 江源县| 扬中市| 浦江县| 吴旗县| 北碚区| 桃源县| 黄石市| 盐山县| 怀柔区| 惠水县| 公安县| 五峰| 开封县| 车致| 永丰县| 大埔区| 天长市| 镇远县| 湖北省| 瑞丽市| 永定县| 武定县| 集安市| 西昌市| 彩票|