Python在生物信息学中的应用:在字节串上执行文本操作

2024-02-21 16:34:21 浏览数 (2)

如何在字节串(Byte String)上执行常见的文本操作(例如,拆分、搜索和替换)。

解决方案

字节串支持大多数和文本字符串一样的内置操作。例如:

代码语言:javascript复制
>>> 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'
>>>

类似的操作同样适用于字节数组:

代码语言:javascript复制
>>> 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')
>>>

我们也可以在字节串上执行正则表达式的模式匹配操作,但是模式本身需要是字节串的形式来指定。例如:

代码语言:javascript复制
>>>
>>> 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']
>>>

讨论

大多数情况下,几乎所有能在文本字符串上执行的操作都可以在字节串上进行。但是,还是有几个显著区别值得注意。例如:

代码语言:javascript复制
>>> a = 'Hello World' # Text string
>>> a[0]
'H'
>>> a[1]
'e'
>>> b = b'Hello World' # Byte string
>>> b[0]
72
>>> b[1]
101
>>>

这种语义上的差异会对试图按照字符的方式处理面向字节流数据的程序带来影响。

另外,字节串并没有提供一个美观的字符串表示,因此打印结果并不美观,除非首先将其解码为字符串。例如:

代码语言:javascript复制
>>> s = b'Hello World'
>>> print(s)
b'Hello World' # Observe b'...'
>>> print(s.decode('ascii'))
Hello World
>>>

最后总结一下,通常来说,如果要同文本打交道,在程序中使用普通的文本字符串就好,不要使用字节串。

参考

  • 《Python Cookbook》第三版
  • http://python3-cookbook.readthedocs.org/zh_CN/latest/

0 人点赞