Разбор текстового файла с заголовками даты и несколькими записями - PullRequest
0 голосов
/ 22 января 2020

Я пытался проанализировать большой текстовый файл и преобразовать его в словарь для дальнейшего анализа. Вот пример текстового файла:

Mar 2 (2020, year not always present)
first paragraph
second line of first paragraph

second paragraph
second line of second paragraph

Mar 3
More lines
these two should be grouped together
because they don't have a blank line in between them

however this line is a start of a new "entry"

sometimes they only have one line, sometimes many.

В идеале это приведет к следующему словарю Python:

{"Mar 2": ["first paragraph\nsecond line of first paragraph", "second paragraph\nsecond line of second paragraph"], "Mar 3": ["More lines\nthese two should be grouped together\nbecause they\ndon't have a blank line in between them", "however this line is a start of a new \"entry\"", "sometimes they only have one line, sometimes many."]}

Я попытался использовать следующий код, и он почти работает но я не уверен, что не так.

def isdate(line):
    return line.lower().split(" ")[0] in ("jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sept", "oct", "nov", "dec")

data = ...

lines = data.split("\n")
i = 0
data = {}
while i < len(lines):
    if isdate(lines[i]):
        date = lines[i]
        data[date] = []
        i += 1
        while not isdate(lines[i]):
            curr_d = ""
            while lines[i].strip(" ") != "":
                curr_d += lines[i] + "\n"
                i += 1
            i += 1
            data[date].append(curr_d)
    else:
        print("error in parsing")
        break

Проблема с моим кодом состоит в том, что он выводит правильные данные , однако происходит сбой при достижении конца. Извините, что не включил это ранее, я только что понял, что на самом деле он выводит правильные данные, но просто вылетает.

Я не думаю, что это дубликат, хотя очень сложно найти что-то такое уточните c все же это общее (если вы понимаете, о чем я), хотя я уверен, что некоторые ТАК волшебники меня поправят.

Заранее спасибо.

1 Ответ

2 голосов
/ 22 января 2020

Вы можете сделать это так:

def isdate(line):
    return line.lower().split(" ")[0] in ("jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sept", "oct", "nov", "dec")

with open("file.txt") as f:
    lines = f.readlines()

data = {}
line_concat = ""
for line in lines:
    if isdate(line): # new key
        if line_concat: # save previous element to old data point
            data[key].append(line_concat)
        month, day = line.split(" ")[0:2]
        key = month+" "+day
        data[key] = []
        continue
    if line.strip(): # if not empty line
        line_concat += line # add line to actual value as memory
    else:
        data[key].append(line_concat) # add the element to the list
        line_concat = "" # set memory empty
data[key].append(line_concat)
for d in data:
    print(d,data[d])

Вывод:

Mar 2 ['first paragraph\nsecond line of first paragraph\n', 'second paragraph\nsecond line of second paragraph\n']
Mar 3
 ["More lines\nthese two should be grouped together\nbecause they don't have a blank line in between them\n", 'however this line is a start of a new "entry"\n', 'sometimes they only have one line, sometimes many.']

...