2013-06-19 3 views
0

Я новичок в кодировании, и я столкнулся с проблемой, пытаясь создать свой собственный fastq masker. Первый модуль должен обрезать строку с помощью +, изменить заголовок последовательности (начинается с>) на номер строки, сохраняя последовательности и линии качества (линии A, G, C, T и Unicode) соответственно) ,Включение нескольких списков в один текстовый файл

class Import_file(object): 

def trim_fastq (self, fastq_file): 
    f = open('path_to_file_a', 'a') 
    sanger = [] 
    sequence = [] 
    identifier = [] 
    plus = [] 
    f2 = open('path_to_file_b') 

    for line in f2.readlines(): 
     line = line.strip() 
     if line[0]=='@': 
      identifier.append(line) 
      identifier.replace('@%s','>[i]' %(line)) 

     elif line[0]==('A' or 'G'or 'T' or 'U' or 'C'): 
      seq = ','.join(line) 
      sequence.append(seq) 

     elif line[0]=='+'and line[1]=='' : 
      plus.append(line) 
      remove_line = file.writelines() 

     elif line[0]!='@' or line[0]!=('A' or 'G'or 'T' or 'U' or 'C') or line[0]!='+' and line[1]!='': 
      sanger.append(line) 

     else: 
      print("Danger Will Robinson, Danger!") 


    f.write("'%s'\n '%s'\n '%s'" %(identifier, sequence, sanger)) 
    f.close() 

    return (sanger,sequence,identifier,plus) 

Теперь на мой вопрос. Я запустил это и не появляется ошибка, однако целевой файл пуст. Мне интересно, что я делаю неправильно ... Это мой способ обработать списки или отсутствие .join? Прошу прощения, если это дубликат. Просто я не знаю, в чем тут ошибка. Кроме того, важно отметить ... Это не какая-то домашняя работа, мне просто нужен маскиратор для работы ... Любая помощь очень ценится, и все упоминания об улучшении кода приветствуются. Благодарю.

Примечание (формат fastq):

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50 
TTGCCTGCCTATCATTTTAGTGCCTGTGAGGTGGAGATGTGAGGATCAGT 

+ 

hhhhhhhhhhghhghhhhhfhhhhhfffffe`ee[`X]b[d[ed`[Y[^Y 

Edit: Тем не менее не в состоянии получить что-нибудь, но работать на нем.

+1

Думаю, вам стоит взглянуть на [biopython] (http://biopython.org/wiki/SeqIO). – root

+1

Я не уверен, что вы хотите проверить в своих операторах 'if' и' else', но код, который у вас есть, определенно не собирается его проверять. – alexis

+0

Я думаю, что такие вещи, как 'if '@' == [0] в строке:' должны были быть 'if line [0] == '@':', но я не уверен. – Brian

ответ

1

Ваша проблема с вашим пониманием оператора возврата. return x означает остановку выполнения текущей функции и возврат x обратно тому, кто ее назвал. В коде у вас есть:

return sanger 
return sequence 
return identifier 
return plus 

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

f.write("'%s'\n '%s'\n '%s'" %(identifier, sequence, sanger)) 
f.close() 
return (sanger,sequence,identifier,plus) 

Это должно дать вам хотя бы некоторый результат в файле. Независимо от того, находится ли этот вывод в нужном формате, я не могу сказать.

Редактировать: Просто заметили, что вы использовали /n и, вероятно, хотите \n, поэтому я внес изменения в свой ответ здесь.

+0

Спасибо за идею кортежа ... также, я до сих пор не получаю выход. – Fabien

1

У вас есть все виды ошибок, кроме того, что было адресовано @Brian. Я предполагаю, что ваши тесты if и else пытаются проверить первый символ line? Вы бы сделать это с

if line[0] == '@': 
    etc. 

Вы, вероятно, нужно больше писать сценарии в ближайшее время, поэтому я предлагаю вам работать через Python Tutorial, так что вы можете получить в верхней части основы. Это будет стоить ваше время.

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