Почему последний текстовый блок не входит в содержимое блока?

#python #python-3.x #list #algorithm #dictionary

Вопрос:

У меня есть текстовый файл, разделенный новой строкой или - символом.

 x = {"file_data":"               Bakeryrn            Company GbRrn        Oranienburger Straße 120rn            10119 BerlinrnrnrnrnBill no.3-7721         11:29:51 20.04.2021rnrn------------------------------------------rn1x Cappuccino          2,70€    2,70€  Arnrn                                  --------rnrnTotal          2,70€rnrnGiven (iZettle)                     2,7€rnrnrn------------------------------------------rnUSt.%     gross      net              USt.rnA=7%      2,70€     2,52€            0,18€rnrnrnrn             Table: Counterrn          Terminal: Terminal 1rnTSE-Transaktion     1831rnTSE-Signatur-Nr.    98009rnTSE-Start           2020-04-21T09:29:38.00000ZrnTSE-Stop            2020-04-21T09:29:50.00000ZrnTSE-Seriennummer    5f2897cc074ae841330658eadd324661159f53b7ffd29215rnTSE-Zeitformat      utcTimernTSE-Signatur        bXkPffFOcetbFokYrOqr/7EYrAc0PH6rrnTSE-Hashalgorithmus ecdsa-plain-SHA256rnTSE Status          In evaluationrnrnrnrnrn         Ust-Id: DE11111111rn"}
 

Моя задача-получить положение каждого блока и их содержимое(блоки разделяются либо несколькими символами новой строки, либо полной строкой, содержащей разделитель - ).

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

Вот мой код, чего мне здесь не хватает?

 y = x["file_data"]

z = y.split('rn')

block = []
block_content = []

start_row, start_col, end_row, end_col = None, None, None, None
skip_line_count = 0

for i, row in enumerate(z):
    if any(letter.isalnum() for letter in row):
        if not start_row and not start_col:
            start_row = i
            start_col = row.index(row.replace(" ", "")[0])
            end_row = start_row
            end_col = row.index(row.replace(" ", "")[-1])
        else:
            end_row = i
            end_col = row.index(row.replace(" ", "")[-1])
    elif all(letter in ["", "-"] for letter in row):
        skip_line_count  = 1
        if skip_line_count == 2 and start_row != None and start_col != None:
            block.append({
                "start_row": start_row,
                "start_col": start_col,
                "end_row": end_row,
                "end_col": end_col,
            })
            block_content.append(z[start_row : end_row   1])
            start_row, start_col, end_row, end_col = None, None, None, None
            skip_line_count = 0
 

Ожидаемые block_content результаты должны содержать TSE Status In evaluation как часть одного блока.

Прямо сейчас, последнее block_content -это

 ['USt.%     gross      net              USt.', 'A=7%      2,70€     2,52€         0,18€']`
 

Комментарии:

1. Похоже, что при завершении цикла for, если вы определили начальную точку блока, вам следует установить значение end_row в конце z и добавить данные в block_content

2. Спасибо, что указали на это. Можете ли вы объяснить, почему skip_line_count=4 , когда i = 38, это должно быть 2 так . Я немного запутался здесь. по логике вещей, skip_line_count не следует идти выше 2 .

Ответ №1:

Благодаря комментарию @itprorh66 я вычислил последнюю недостающую логику. Мне пришлось добавить блок и добавить содержимое блока после завершения цикла.

 block.append({
   "start_row": start_row,
   "start_col": start_col,
   "end_row": end_row,
   "end_col": end_col,
})
block_content.append(z[start_row : end_row   1])