在2个文件文本中查找常见项目

时间:2015-04-15 03:19:33

标签: python file loops nested lines

向您介绍我的问题的背景:我有两个包含基因信息的文件:

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)

但在我的情况下,我只想比较每一行的某些列,因为每行中的行都有不同的信息(开头和结尾除外)。是否有类似的方法来比较文件中的行,但仅限于某些指定的项目?

1 个答案:

答案 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的所有行读入列表并在内循环中使用该列表。