Извлечь определенные записи из выходного файла blastx, записать в новый файл

Я создал сценарий, который успешно ищет ключевые слова (указанные пользователем) в выходном файле Blastx в формате XML. Теперь мне нужно записать те записи (запрос, попадание, оценка, оценка и т. д.), которые содержат ключевое слово в заголовке выравнивания, в новый файл.

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

  • Проблема № 1: что, если ошибки Python и в одном из списков отсутствует значение...? Тогда все остальные списки будут давать неверную информацию относительно запроса ("проскальзывание строки", если хотите...).

  • Проблема № 2: даже если Python не ошибается и все списки имеют одинаковую длину, как мне записать их в файл, чтобы первый элемент в каждом списке был связан друг с другом (и, таким образом, элемент № 10 из каждый список также связан?) Должен ли я вместо этого создать словарь?

  • Проблема № 3: словари имеют только одно значение для ключа, что, если мой запрос имеет несколько разных попаданий? Не уверен, будет ли он перезаписан или пропущен, или это просто ошибка. Какие-либо предложения? Мой текущий скрипт:

    from Bio.Blast import NCBIWWW
    from Bio.Blast import NCBIXML
    import re
    
    #obtain full path to blast output file (*.xml)
    outfile = input("Full path to Blast output file (XML format only): ")
    
    #obtain string to search for
    search_string = input("String to search for: ")
    
    #open the output file
    result_handle = open(outfile)
    
    #parse the blast record
    blast_records = NCBIXML.parse(result_handle)
    
    #initialize lists
    query_list=[]
    hit_list=[]
    expect_list=[]
    length_list=[]
    
    #create 'for loop' that loops through each HIGH SCORING PAIR in each ALIGNMENT from each RECORD
    for record in blast_records:
            for alignment in record.alignments:     #for description in record.descriptions???
                    for hsp in alignment.hsps:      #for title in description.title???
    
                            #search for designated string
                            search = re.search(search_string, alignment.title)
    
                            #if search comes up with nothing, end
                            if search is None:
                                    print ("Search string not found.")
                                    break
    
                            #if search comes up with something, add it to a list of entries that match search string
                            else:
    
                                    #option to include an 'exception' (if it finds keyword then DOES NOT add that entry to list)
                                    if search is "trichomonas" or "entamoeba" or "arabidopsis":
                                            print ("found exception.")
                                            break
                                    else:
    
                                            query_list.append(record.query)
                                            hit_list.append(alignment.title)
                                            expect_list.append(expect_val)
                                            length_list.append(length)
    
                                            #explicitly convert 'variables' ['int' object or 'float'] to strings
                                            length = str(alignment.length)
                                            expect_val = str(hsp.expect)
    
                                            #print ("\nquery name: " + record.query)
                                            #print ("alignment title: " + alignment.title)
                                            #print ("alignment length: " + length)
                                            #print ("expect value: " + expect_val)
                                            #print ("\n***Alignment***\n")
                                            #print (hsp.query)
                                            #print (hsp.match)
                                            #print (hsp.sbjct + "\n\n")
    
    
                                            if query_len is not hit_len is not expect_len is not length_len:
                                                    print ("list lengths don't match!")
                                                    break
                                            else:
    
                                                    qrylen = len(query_list)
                                                    query_len = str(qrylen)
                                                    hitlen = len(hit_list)
                                                    hit_len = str(hitlen)
                                                    expectlen = len(expect_list)
                                                    expect_len = str(expectlen)
                                                    lengthlen = len(length_list)
                                                    length_len = str(lengthlen)
                                                    outpath = str(outfile)
    
                                                    #create new file
                                                    outfile = open("__Blast_Parse_Search.txt", "w")
                                                    outfile.write("File contains entries from [" + outpath + "] that contain [" + search_string + "]")
                                                    outfile.close
    
                                                    #write list to file
                                                    i = 0
                                                    list_len = int(query_len)
                                                    for i in range(0, list_len):
    
                                                            #append new file
                                                            outfile = open("__Blast_Parse_Search.txt", "a")
                                                            outfile.writelines(query_list + hit_list + expect_list + length_list)
                                                            i = i + 1
    
                                                    #write to disk, close file
                                                    outfile.flush()
                                                    outfile.close
    
    print ("query list length " + query_len)
    print ("hit list length " + hit_len)
    print ("expect list length " + expect_len)
    print ("length list length " + length_len + "\n\n")
    print ("first record: " + query_list[0] + " " + hit_list[0] + " " + expect_list[0] + " " + length_list[0])
    print ("last record: " + query_list[-1] + " " + hit_list[-1] + " " + expect_list[-1] + " " + length_list[-1])
    print ("\nFinished.\n")
    

person user1426421    schedule 22.08.2012    source источник


Ответы (1)


Если я правильно понимаю вашу проблему, вы можете использовать значение по умолчанию для проскальзывания линии, например:

try:
  x(list)
except exception:
  append_default_value(list)

http://docs.python.org/tutorial/errors.html#handling-exceptions

или используйте кортежи для ключей словаря, таких как (0,1,1), и используйте метод get для значения по умолчанию.

http://docs.python.org/py3k/library/stdtypes.html#mapping-types-dict

Если вам нужно поддерживать структуры данных в ваших выходных файлах, вы можете попробовать использовать полку:

или вы можете добавить некоторый тип ссылки после каждой записи и дать каждой записи уникальный идентификатор, например, «#32{somekey:value}#21#22#44#»

снова вы можете иметь несколько ключей, используя кортеж.

Я не знаю, поможет ли это, вы можете уточнить, с какими именно частями вашего кода у вас возникли проблемы. Например, x() дает мне вывод y, но я ожидаю z.

person bob    schedule 22.08.2012