- Python進(jìn)階編程:編寫更高效、優(yōu)雅的Python代碼
- 劉宇宙 謝東 劉艷
- 846字
- 2021-04-30 12:39:41
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é)字符串。
- Google Apps Script for Beginners
- 數(shù)據(jù)庫系統(tǒng)教程(第2版)
- Mastering Objectoriented Python
- FreeSWITCH 1.6 Cookbook
- Python零基礎(chǔ)快樂學(xué)習(xí)之旅(K12實(shí)戰(zhàn)訓(xùn)練)
- VMware虛擬化技術(shù)
- HTML5從入門到精通(第4版)
- Java網(wǎng)絡(luò)編程核心技術(shù)詳解(視頻微課版)
- Elasticsearch Essentials
- Emotional Intelligence for IT Professionals
- 玩轉(zhuǎn).NET Micro Framework移植:基于STM32F10x處理器
- TypeScript圖形渲染實(shí)戰(zhàn):2D架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)
- R High Performance Programming
- Advanced C++
- Practical XMPP