我正在寻找一种方法来查看文本文件中的下一行,当第一个字符是字母只有A,G,C,U或N.我创建了一个字典。我可以看到的所有可能性。我已经尝试了itertools,但无济于事,我听说itertools会将所有内容保存在内存中,因为我的文件相当大(有时大于10GB),这将是最无效的。我真的很感激帮助,我已经在这里闲逛了几天寻找答案。我正在思考或尝试正则表达式,但我不知道如何。我真的想找到最有效的大文件方式。这是我(可怜的)尝试。
我已经在Python for-loop look-ahead
上找到了答案f2 = open(path to file)
from itertools import tee
from itertools import permutations
def pairwise(iter):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iter)
next(b, None)
return zip(a, b)
p = permutations(['A','G','U','C','N'])
for per in p:
per = ''.join(per)
dic={'a':[]}
dic['a'].append(per)
for line, next_line in pairwise(f2):
if line in dic['a']:
letter= next_line.split()
unilist.append('%s' %next_line)
print (unilist)
看来问题出在:for line,next_line in pairwise(f2) 我会非常感激每一个提示和建议。
编辑:我指的是行中的字符而不是next_line中的字符。
答案 0 :(得分:2)
您的代码有几个问题:
您放弃每个排列循环迭代dic
并从头开始重新创建它。建立一次:
dic={'a':[''.join(per) for per in permutations('AGUCN')]}
但是对于快速成员资格测试(if something in sequence
),请改用set
:
dic={'a': set(''.join(per) for per in permutations('AGUCN'))}
请注意,目前尚不清楚为什么需要一个带有一个键的字典;一个简单的变量就可以了。
您读取了一个文件,但是没有从行中删除换行符。使用换行符,您的if line in dic['a']
测试将永远不会返回True,因为生成
只需将文件视为可迭代文件,在其上调用next()
即可获得下一行:
from itertools import permutations
patterns = set(''.join(per) for per in permutations('AGUCN'))
unilist = []
for line in f2:
if line.strip() in patterns:
unilist.append(next(f2).strip())
甚至:
from itertools import permutations
patterns = set(''.join(per) for per in permutations('AGUCN'))
unilist = [next(f2).strip() for line in f2 if line.strip() in patterns]
你并没有真正展望未来。你在看后面;如果前一行与条件匹配,则追加下一行。
答案 1 :(得分:1)
“itertools is evil”是一个完全基于unbased的语句 - 相反,itertools提供了一组不同的工具来处理iterables,
在这种情况下,您必须使用itertools.tee
- 否,它不会将您的所有物品保留在内存中