我想读取一个带有数据的文件,以十六进制格式编码:
01ff0aa121221aff110120...etc
文件包含> 100.000这样的字节,一些超过1.000.000(它们来自DNA测序)
我尝试了以下代码(和其他类似的代码):
filele=1234563 f=open('data.geno','r') c=[] for i in range(filele): a=f.read(1) b=a.encode("hex") c.append(b) f.close()
这给每个字节分别"aa""01""f1"等,这对我来说是完美的!
这可以正常工作(在这种情况下)字节no 905碰巧是"1a".我也尝试了在同一个字节停止的ord()函数.
可能有一个简单的解决方案?
简单的解决方法是binascii
:
import binascii # Open in binary mode (so you don't read two byte line endings on Windows as one byte) # and use with statement (always do this to avoid leaked file descriptors, unflushed files) with open('data.geno', 'rb') as f: # Slurp the whole file and efficiently convert it to hex all at once hexdata = binascii.hexlify(f.read())
这只是给你一个str
十六进制值,但它比你想要做的快得多.如果你真的想要每个字节有一堆长度为2的十六进制字符串,你可以轻松转换结果:
hexlist = map(''.join, zip(hexdata[::2], hexdata[1::2]))
这将产生str
对应于每个字节的十六进制编码的len 2 的列表.为了避免临时副本hexdata
,您可以使用类似但稍微不那么直观的方法,通过使用相同的迭代器两次避免切片zip
:
hexlist = map(''.join, zip(*[iter(hexdata)]*2))
更新:
对于Python 3.5及更高版本的人来说,bytes
对象产生了一个.hex()
方法,因此不需要模块将原始二进制数据转换为ASCII十六进制.顶部的代码块可以简化为:
with open('data.geno', 'rb') as f: hexdata = f.read().hex()