2014-02-18 2 views
1

Я новичок в Python, поэтому, пожалуйста, несите меня.Ссылка на список имен с использованием Python

я не могу получить этот небольшой скрипт для правильной работы:

genome = open('refT.txt','r') 

- файл данных ссылка генома с кучей (2 миллиона) из контигов:

Contig_01 
TGCAGGTAAAAAACTGTCACCTGCTGGT 
Contig_02 
TGCAGGTCTTCCCACTTTATGATCCCTTA 
Contig_03 
TGCAGTGTGTCACTGGCCAAGCCCAGCGC 
Contig_04 
TGCAGTGAGCAGACCCCAAAGGGAACCAT 
Contig_05 
TGCAGTAAGGGTAAGATTTGCTTGACCTA 

открыт файл:

cont_list = open('dataT.txt','r') 

список контигов, что я хочу, чтобы извлечь из списка наборов данных ред выше:

Contig_01 
Contig_02 
Contig_03 
Contig_05 

Мой безнадежный сценарий:

for line in cont_list: 
    if genome.readline() not in line: 
     continue 
    else: 
     a=genome.readline() 
     s=line+a  
     data_out = open ('output.txt','a') 
     data_out.write("%s" % s) 
     data_out.close() 

input('Press ENTER to exit') 

Сценарий успешно пишет первые три контигов в выходной файл, но по какой-то причине он не кажется, способны пропускать «contig_04» , которого нет в списке, и перейдите к «Contig_05».

я мог бы показаться ленивым ублюдком для размещения, но я потратил весь день на этом крошечном кусочке кода -_-

+1

проблема заключается в том, что ваш 'continue' заставляет вас пропустить строку в' cont_list'. вам нужно зацикливаться на геноме только до тех пор, пока вы не найдете 'line' – njzk2

+1

. Помимо пропущенных строк, имена строк гарантированно появятся в том же порядке в файлах' cont_list' и 'genome'? – user2357112

+1

вы можете решить это просто, заменив 'if' на' while' – njzk2

ответ

1

Я бы первым попытаться создать итератор, который дает кортеж: (contig, gnome):

def pair(file_obj): 
    for line in file_obj: 
     yield line, next(file_obj) 

Теперь я хотел бы использовать, чтобы получить желаемые элементы:

wanted = {'Contig_01', 'Contig_02', 'Contig_03', 'Contig_05'} 
with open('filename') as fin: 
    pairs = pair(fin) 
    while wanted: 
     p = next(pairs) 
     if p[0] in wanted: 
      # write to output file, store in a list, or dict, ... 
      wanted.forget(p[0]) 
0

Я рекомендовал бы несколько вещей:

  • Попробуйте использовать with open(filename, 'r') as f вместо f = open(...)/f.close(). with будет обрабатывать закрытие для вас. Он также рекомендует вам обрабатывать все файлы ввода-вывода в одном месте.

  • Постарайтесь прочитать все грани, которые вы хотите, в список или другую структуру. Это боль, когда сразу открывается много файлов. Прочитайте все строки сразу и сохраните их.


Вот пример кода, который может делать то, что вы ищете

from itertools import izip_longest 

# Read in contigs from file and store in list 
contigs = [] 
with open('dataT.txt', 'r') as contigfile: 
    for line in contigfile: 
     contigs.append(line.rstrip()) #rstrip() removes '\n' from EOL 

# Read through genome file, open up an output file 
with open('refT.txt', 'r') as genomefile, open('out.txt', 'w') as outfile: 
    # Nifty way to sort through fasta files 2 lines at a time 
    for name, seq in izip_longest(*[genomefile]*2): 
     # compare the contig name to your list of contigs 
     if name.rstrip() in contigs: 
      outfile.write(name) #optional. remove if you only want the seq 
      outfile.write(seq) 
0

Вот довольно компактный подход, чтобы получить последовательности, которые вы хотите.

def get_sequences(data_file, valid_contigs): 
    sequences = [] 

    with open(data_file) as cont_list: 
     for line in cont_list: 
      if line.startswith(valid_contigs): 
       sequence = cont_list.next().strip() 
       sequences.append(sequence) 

    return sequences 

if __name__ == '__main__': 
    valid_contigs = ('Contig_01', 'Contig_02', 'Contig_03', 'Contig_05') 
    sequences = get_sequences('dataT.txt', valid_contigs) 
    print(sequences) 

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

Пример вывода:

['TGCAGGTAAAAAACTGTCACCTGCTGGT', 
'TGCAGGTCTTCCCACTTTATGATCCCTTA', 
'TGCAGTGTGTCACTGGCCAAGCCCAGCGC', 
'TGCAGTAAGGGTAAGATTTGCTTGACCTA'] 
Смежные вопросы