Файл разбора Python в словарь списка списков: цикл for добавляет только последнюю строку - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь проанализировать файл с постоянным форматированием: заголовок и несколько строк текста, разделенных пробелами. Я хочу начать новый словарный ключ, когда строка имеет одно значение, прочитать следующие строки в список списков, каждый из которых является разделенными словами. Сначала я попытался использовать this , чтобы попытаться заставить программу идентифицировать новый маркер и использовать счетчик индекса для установки нового ключа. Затем я сначала использовал this , чтобы разделить строки соответственно.

Вот как выглядит мой код:

import sys

def openfile(file):
    frames = {}
    index = 0
    with open(file, 'r') as f:
        for line in f:
            if line.strip() == '5310':
                index +=1
            else:
                newline = line
                print newline
                frames[index] = []
                frames[index].append([newline.split()])
        print frames

openfile(sys.argv[1])

Индекс будет правильно отсчитываться, и «print newline» печатает все нужные мне строки, но окончательно напечатанный словарь представляет собой вложенный список:

{1:[['last', 'line', 'of', 'input', 'file']]}

Вместо этого я хочу:

{1:[[line1],[line2] ...], 2:[[nextline], [nextline] ...], ... , key n : [[line], [line]....[lastline]]}

Я также пробовал:

def openfile(file):
    frames = {}
    index = 0
    with open(file) as f:
         for line in f:
            if str(line.strip()) == '5310':
                index += 1
            else:
                frames[index] = []
                frames[index].append([line.split()])
    return frames

Это также не будет работать. Это оставляет меня с двумя вопросами: 1: почему мой текущий код печатает, но не добавляет строки, которые я хочу? 2. что еще я могу попытаться заставить это работать?

редактировать Спасибо! Мне удалось заставить его работать. Если у кого-то есть подобная проблема, вот мой код, который работает:

import sys

def openfile(file):
    frames = {}
    index = 0
    with open(file, 'r') as f:
        for line in f:
            if line.strip() == '5310':
                index +=1
                frames[index] = []
            else:
                newline = line
                print newline
                frames[index].append([newline.split()])
        print frames

openfile(sys.argv[1])

1 Ответ

0 голосов
/ 27 июня 2018

Ваша проблема очевидна ... как только вы видите проблему: -)

            frames[index] = []
            frames[index].append([newline.split()])

Каждый раз в цикле вы стираете предыдущий прогресс и начинаете с нового, пустого списка. Таким образом, только результат последней итерации находится в frames.

Код инициализации должен быть выполнен только один раз, прежде чем войти в цикл.

with open(file) as f:
     frames[index] = []
     for line in f:

... или другой подходящий пункт для вашего заявления.

...