向您介绍我的问题的背景:我有两个包含基因信息的文件:
pos.bed包含特定基因的位置和hg19-genes.txt包含该物种的所有现有基因,具有一些指示的特征,例如基因的位置(起点和终点),其名称,符号等。
问题是在pos中,仅指示基因的位置,而不是其名称/符号。我想通读这两个文件并比较每行的开头和结尾。如果有匹配,我想得到相应基因的符号。
我写了这个小python代码:
pos=open('C:/Users/Claire/Desktop/Arithmetics/pos.bed','r')
gen=open('C:/Users/Claire/Desktop/Arithmetics/hg19-genes.txt','r')
for row in pos:
row=row.split()
start=row[11]
end=row[12]
for row2 in gen:
row2=row2.split()
start2=row2[3]
end2=row2[4]
sym=row2[10]
if start==start2 and end==end2:
print sym
pos.close()
gen.close()
但似乎这只是逐行比较两个文件(如文件pos中的第2行和文件gen中的第2行)。所以我尝试将if添加到if循环但是我收到一条错误消息:< / p>
else:
gen.next()
StopIteration Traceback (most recent call last)
<ipython-input-9-a309fdca7035> in <module>()
14 print sym
15 else:
---> 16 gen.next()
17
18 pos.close()
StopIteration:
我知道可以比较两个文件的所有行,无论行的位置如何,都可以这样做:
same = set(file1).intersection(file2)
但在我的情况下,我只想比较每一行的某些列,因为每行中的行都有不同的信息(开头和结尾除外)。是否有类似的方法来比较文件中的行,但仅限于某些指定的项目?
答案 0 :(得分:1)
gen
是一个迭代器,它只对文件的行进行一次迭代,也就是说,在处理row
中的第一个pos
时。最简单的解决方法是在外部循环中打开gen
文件:
pos=open('C:/Users/Claire/Desktop/Arithmetics/pos.bed','r')
for row in pos:
row=row.split()
start=row[11]
end=row[12]
gen=open('C:/Users/Claire/Desktop/Arithmetics/hg19-genes.txt','r')
for row2 in gen:
row2=row2.split()
start2=row2[3]
end2=row2[4]
sym=row2[10]
if start==start2 and end==end2:
print sym
gen.close()
pos.close()
另一种选择是将gen
的所有行读入列表并在内循环中使用该列表。