#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])