所以我有几个很大的文件代表了人类基因组中的每一个位置。这两个文件都是基因组中每个位置的某种类型的“分数”的二进制掩码,我有兴趣获得一个新的掩码,其中两个分数都是"1“,也就是两个掩码的交集。
例如:
File 1: 00100010101
File 2: 11111110001
Desired output: 00100010001在python中,将这些大文件(包含500-2.5亿个字符)读入字符串非常快。但是,我不能只是把字符串放在一起。我可以这样做
bin(int('0001',2) & int('1111', 2))但是,有没有一种更直接的方式,不需要我在额外的0,并转换回字符串在最后?
发布于 2015-12-09 20:28:40
我认为将二进制和操作转换为内置的整数类型可能比按字符工作要快得多(因为Python的int是用C编写的,而不是用Python编写的)。我建议您处理输入文件的每一行,而不是一次性处理整个数百万字符的字符串。二进制和操作不需要任何携带,因此不存在单独处理每一行的问题。
为了避免笨拙的字符串操作将结果填充到正确的长度,您可以使用str.format方法一次性将整数转换为具有正确长度的二进制字符串。下面是一个将输出写入一个新文件的实现:
import itertools
with open(filename1) as in1, open(filename2) as in2, open(filename3, "w") as out:
for line1, line2 in itertools.izip(in1, in2):
out.write("{0:0{1}b}\n".format(long(line1, 2) & long(line2, 2), len(line1) - 1))我使用字符串格式化的一个简洁特性--迷你语言--使用第二个参数为转换的数字传递所需的长度。如果您可以依赖始终有50位二进制数字的行(包括文件末尾),您可以使用{:050b}硬编码长度,而不是从输入行的长度计算它。
https://stackoverflow.com/questions/34187563
复制相似问题