如何在字节串(Byte String)上执行常见的文本操作(例如,拆分、搜索和替换)。
解决方案
字节串支持大多数和文本字符串一样的内置操作。例如:
>>> 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'
>>>
类似的操作同样适用于字节数组:
>>> 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')
>>>
我们也可以在字节串上执行正则表达式的模式匹配操作,但是模式本身需要是字节串的形式来指定。例如:
>>>
>>> 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']
>>>
讨论
大多数情况下,几乎所有能在文本字符串上执行的操作都可以在字节串上进行。但是,还是有几个显著区别值得注意。例如:
>>> a = 'Hello World' # Text string
>>> a[0]
'H'
>>> a[1]
'e'
>>> b = b'Hello World' # Byte string
>>> b[0]
72
>>> b[1]
101
>>>
这种语义上的差异会对试图按照字符的方式处理面向字节流数据的程序带来影响。
另外,字节串并没有提供一个美观的字符串表示,因此打印结果并不美观,除非首先将其解码为字符串。例如:
>>> 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/
关于简说基因
生信平台
Galaxy中国(UseGalaxy.cn)致力于打造中国人的云上生物信息基础设施。大量在线工具免费使用。无需安装,用完即走。活跃的用户社区,随时交流使用心得。
生信培训
简说基因的生信培训班,荣获学员的一致好评。如果你也对生物信息学感兴趣,欢迎来跟简说基因,学真生信。
生信分析
我们能够承接所有 NGS 组学数据分析业务,包括但不限于 WGS / WES / RNA-seq 等。基因组组装、注释,以及各种重测序业务都可以与简说基因合作。