Как преобразовать словарь с основным текстом и несколькими подтекстами - PullRequest
0 голосов
/ 20 мая 2019

У меня есть текстовый файл. Файл содержит строки. После нескольких строк есть одна пустая строка. Эта строка используется для обозначения конца раздела. Первая пустая строка используется для обозначения конца основного текста и начала дополнительного текста. Если обнаружена другая пустая строка, это означает, что субтекстовая часть завершена и начинается новая основная текстовая часть.

Я написал код для решения этой проблемы в Python. Основной текст служит ключом в словаре Python, а подтекст - значением этого ключа. Несколько подтекстов хранятся в виде списка.

В коде переменные имеют следующий вид:

 word  : Empty dictionary
 value : List  containing the sub headings
 key   : Contains the current main heading
 i     : set to 1 at the start to get the first line, when a 
         new line is detected, it changes to -1. When another 
         empty line is detected, it changes to 1 again.

Здесь 1 означает, что строка содержит основной текст, а -1 означает дополнительный текст.

Здесь, если я равен 1, основной текст добавляется к ключу. Если это -1, подтекст добавляется в список значений.

Если мы обнаружим еще одну пустую строку, мы проверяем, равен ли я -1, если это правда, мы устанавливаем обновление словаря слов с помощью {key: value}.

Затем мы снова меняем знак i.

Моя проблема в том, что программа, кажется, находится в бесконечном цикле.

Спасибо, что прочитали мою проблему. Любая помощь будет оценена.

import json

class test1:

    word = {}
    value = []
    i = 1
    key = ''
    filepath = 'we.txt'
    with open(filepath) as fp:
            lines = fp.readlines()
            for j in range(0, len(lines)):
                    currentline = lines[j]
                    if i == 1:
                            key = currentline

                    if currentline in ['\n', '\r\n']:
                            if i == -1:
                                    word.update({key: value})

                    i = i * -1

                    if i == -1:
                            value.append(currentline)
            print(word)

Вывод должен быть

mainText11: ['subtext1', 'subtext2'] maintext2: ['subtext1', 'subtext2', 'subtext3']

We.txt содержит следующее:

                  main heading1

                  sub heading1
                  sub heading2

                  main heading2

ОБНОВЛЕНИЕ: Я сделал некоторые изменения в коде. Но проблема остается.

1 Ответ

0 голосов
/ 20 мая 2019

Чтобы зациклить строки файла, вот что я бы сделал:

with open(filepath) as fp:
    lines = fp.readlines() # read all the lines from the file
    for line in lines: # loop over the list containing all lines
        # same as in your while loop

В вашем коде line не изменяется внутри цикла while, поэтому это никогда не заканчивается, вы никогда не читаете более одной строки файла.


Edit:

Вот ваш код (я попытался внести в него как можно меньше изменений):

word = {}
value = []
i = 1
key = ''
filepath = 'we.txt'
with open(filepath) as fp:
        lines = fp.readlines()
        for j in range(0, len(lines)):
                currentline = lines[j]

                if currentline in ['\n', '\r\n']:
                        if i == -1:
                                word.update({key: value})
                                value = [] # start with empty value for the next key
                        i = i * -1 # switch only if we read a newline
                        continue # skip to next line (the newline shouldn't be stored)

                # store values only after we know, it's not an empty line
                if i == 1:
                        key = currentline()
                if i == -1:
                        value.append(currentline)

        word.update({key: value}) # update also with the last values
        print(word)

Значения будут иметь переводы строк в конце. Чтобы избавиться от них, я бы выделил первые строки цикла:

                currentline = lines[j].strip() # strip line, so it doesn't end with '\n'
                if not currentline: # if currentline is empty

Кроме того, вы можете переместить весь цикл за пределы с помощью.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...