2015-04-15 13 views
0

Чтобы ввести вас в контексте моей проблемы: У меня есть два файла, содержащие информацию о генах:Найти общие элементы в 2 текстовом файле

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() 

Но, похоже, это только сравнивая строки двух файлов по линии (например, строка 2 в поз файлов с линией 2 в файле ген только) .so я пытался добавить еще к, если цикл, но я получаю сообщение об ошибке:

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: 

Я знаю, что можно сравнить все строки 2 файла, независимо от положения линии, делая что-то вроде:

same = set(file1).intersection(file2) 

, но в моем случае я только хочу, чтобы сравнить несколько колонок каждой строки, так как строки имеют различную информацию в каждом файле (кроме начала и конца). Есть ли аналогичный способ сравнения строк в файлах, но только для некоторых определенных элементов?

ответ

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 в список и использовать этот список во внутреннем цикле.

+0

Благодарим за быстрый и полезный ответ! –

Смежные вопросы