Python: помещение определенных строк файла в список - PullRequest
0 голосов
/ 17 апреля 2011

Привет,

Я попал в следующую проблему:

Имеется файл следующей структуры:

'>some cookies  
chocolatejelly  
peanutbuttermacadamia  
doublecoconutapple  
'>some icecream  
cherryvanillaamaretto  
peanuthaselnuttiramisu  
bananacoffee  
'>some other stuff  
letsseewhatfancythings  
wegotinhere  

Цель: поместить все записи после каждой строки, содержащей '>', в список как одну строку

Код:

def parseSequenceIntoDictionary(filename):
    lis=[]
    seq=''
    with open(filename, 'r') as fp:
        for line in fp:
            if('>' not in line):
                seq+=line.rstrip()
            elif('>' in line):
                lis.append(seq)
                seq=''
        lis.remove('')
        return lis

Так что эта функция проходит через каждую строку файла если нет '>', он объединяет все следующие строки и удаляет затем', если встречается '>', он автоматически добавляет сцепленную строку в список и 'очищает' строку 'seq' для объединения следующей последовательности

Проблема: Чтобы взять пример входного файла, он только помещает материал из «некоторых куки» и «некоторого мороженого» в список, но не из «какого-то другого материала». Итак, мы получаем в результате:

[chocolatejelly 
peanutbuttermacadamia 
doublecoconutapple, cherryvanillaamaretto 
peanuthaselnuttiramisu 
bananacoffee] but not  

[chocolatejelly 
peanutbuttermacadamia 
doublecoconutapple, cherryvanillaamaretto 
peanuthaselnuttiramisu 
bananacoffee, letsseewhatfancythings 
wegotinhere]  

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

Заранее спасибо за любые подсказки!

Ответы [ 5 ]

2 голосов
/ 17 апреля 2011

Проблема в том, что вы сохраняете текущую секцию seq только тогда, когда попали в строку с '>' в ней. Когда файл заканчивается, у вас по-прежнему открыт этот раздел, но вы его не сохраняете.

Самый простой способ исправить вашу программу - это:

def parseSequenceIntoDictionary(filename):
    lis=[]
    seq=''
    with open(filename, 'r') as fp:
        for line in fp:
            if('>' not in line):
                seq+=line.rstrip()
            elif('>' in line):
                lis.append(seq)
                seq=''
        # the file ended
        lis.append(seq) # store the last section
        lis.remove('')
        return lis

Кстати, вы должны использовать if line.startswith("'>"):, чтобы предотвратить возможную ошибку.

1 голос
/ 17 апреля 2011

Вы добавляете seq в список результатов, только если найдена новая строка с>. Таким образом, в конце у вас есть заполненный seq (с данными, которые вам не хватает), но вы не добавляете его в список результатов. Поэтому после цикла просто добавьте seq, если в нем есть какие-то данные, и с вами все будет в порядке.

1 голос
/ 17 апреля 2011
my_list = []
with open('file_in.txt') as f:
    for line in f:
        if line.startswith("'>"):
            my_list.append(line.strip().split("'>")[1])

print my_list  #['some cookies', 'some icecream', 'some other stuff']
0 голосов
/ 17 апреля 2011
import re

def parseSequenceIntoDictionary(filename,regx = re.compile('^.*>.*$',re.M)):
    with open(filename) as f:
        for el in regx.split(f.read()):
            if el:
                yield el.replace('\n','')

print list(parseSequenceIntoDictionary('aav.txt'))
0 голосов
/ 17 апреля 2011

ну, вы можете просто разделить на '> (если я правильно вас понял)

>>> s="""
... '>some cookies
... chocolatejelly
... peanutbuttermacadamia
... doublecoconutapple
... '>some icecream
... cherryvanillaamaretto
... peanuthaselnuttiramisu
... bananacoffee
... '>some other stuff
... letsseewhatfancythings
... wegotinhere  """
>>> s.split("'>")
['\n', 'some cookies  \nchocolatejelly  \npeanutbuttermacadamia  \ndoublecoconutapple  \n', 'some icecream  \ncherryvanillaamaretto  \npeanuthaselnuttiramisu  \nbananacoffee  \n', 'some other stuff  \nletsseewhatfancythings  \nwegotinhere  ']
>>>
...