我使用以下代码组合两个文本文件:
def combine_acpd_ccs(self, ccs_file, acps_file, out_file):
with open(ccs_file, 'r') as in_file1:
with open(acps_file, 'r') as in_file2:
with open(out_file, 'w') as out1:
out1.write('PDB\tPA\tEHSS\tACPS\n')
for line in in_file1:
segs = line.split()
for i in in_file2:
sse_score = i.split()
#print line
#print segs
if segs[0][:-4] == sse_score[0]:
out1.write(segs[0][:-4]+'\t'+segs[1]+'\t'+segs[2]+'\t'+sse_score[1]+'\n')
示例数据如下:
ccs_file:
1b0o.pdb 1399.0 1772.0
1b8e.pdb 1397.0 1764.0
acps_file:
1b0o 0.000756946316066
1b8e 8.40662008775
1b0o 6.25931529116
我期待我的表现如下:
PDB PA EHSS ACPS
1b0o 1399.0 1772.0 0.000756946316066
1b0o 1399.0 1772.0 6.25931529116
1b8e 1397.0 1764.0 8.40662008775
但我的代码只生成了我预期输出的前两行。如果我在第二个segs
循环中打印for
,则只会将ccs_file
中的第一行传递给循环。我出错的任何想法?
答案 0 :(得分:7)
问题是在每次外循环迭代后你不会重新打开/回退in_file2
。
执行
for i in in_file2:
所有后续迭代in_file2
的尝试都不会做任何事情,因为文件指针已经位于文件的末尾。
如果文件相对较小,您可能需要将ccs_file
加载到内存中,然后进行字典查找。