Отказ от ответственности:
- Возможно, я задаю этот вопрос "неправильным путем" - я все еще новичок в программировании, поэтому мне может не хватать правильной терминологии и понимания, чтобы правильно задать вопрос.Извините за это, если я.
- Я знаю, что вы не можете разобрать [X] HTML с регулярным выражением.Я не разбираю это.Я просто сопоставляю строку, чтобы получить количество строк этой строки.
- Я пробовал
lxml
и iter()
, а также iterparse()
, и я попробовал это вот так и вот так .Это не сработало для меня.Я делаю это таким образом. - Я знаю, что код здесь неэффективен (в частности, компиляция выражения регулярного выражения при каждом вызове функции) - я переписал это так, чтобы обеспечить "минимально необходимый код », чтобы задать вопрос, плюс мне немного легче понять, чего я пытаюсь достичь, я думаю.
С этим до конца;этот код работает и выполняет то, что я хочу, то есть, по сути, он берет огромный набор xml-записей и превращает его в словарь в виде { record_id : {element_tag : element_val, element_tag : element_val, ...} }
.
, так как record_id вложен вСаму запись, я сначала использую record_splitter
, чтобы определить количество <RECORD>
и </RECORD>
(beg
и end
).Я передаю beg
и end
в dic_factory
, который находит эти позиции, что-то делает с элементами, вложенными в него, затем устанавливает 'beg' в end +1
и передает его обратно в функцию record_splitter
.
Мой вопрос заключается в том, есть ли лучший способ реализовать этот цикл между функциями, предпочтительно в if __name__ == '__main__'
, чтобы я мог переместить больше моих констант (например, операторов регулярных выражений) в это какхорошо.
Code:
# stored as a text file, but here for clarity
list_of_lines = """
<RECORD>
<TITLE>MISS</TITLE>
<NAME>ELIZABETH</NAME>
<SURNAME>II</SURNAME>
<ADDRESS1>1 BUCKINGHAM PALACE</ADDRESS1>
<ADDRESS2>LONDON</ADDRESS2>
<ADDRESS3>GREATER LONDON</ADDRESS3>
<POST_CODE>W1 11A</POST_CODE>
<CASE_NUM>Q1QQ1234</CASE_NUM>
<ID>32145698</ID>
<LAST_UPDATE_DATE>2016-12-12</LAST_UPDATE_DATE>
</RECORD>
<RECORD>
<TITLE>MR</TITLE>
<NAME>PRINCE</NAME>
<SURNAME>PHILLIP</SURNAME>
<ADDRESS1>1 BUCKINGHAM PALACE</ADDRESS1>
<ADDRESS2>LONDON</ADDRESS2>
<ADDRESS3>GREATER LONDON</ADDRESS3>
<POST_CODE>W1 11A</POST_CODE>
<CASE_NUM>K5KK4321</CASE_NUM>
<ID>56987412</ID>
<LAST_UPDATE_DATE>2017-01-16</LAST_UPDATE_DATE>
</RECORD>
<RECORD>
"""
class recordManager:
def __init__(self):
self.r_location = "list_of_lines.txt"
def record_splitter(self, beg):
re_beg_spl = re.compile(".*<RECORD>")
re_end_spl = re.compile(".*(<\\/RECORD>)")
end = None
for count, line in enumerate( open(self.r_location) ):
if count > beg:
if re_end_spl.match(line):
end = count
if not re_end_spl.match(line):
if re_beg_spl.match(line):
beg = count
else:
break
recordManager.dic_factory(self, beg, end)
def dic_factory(self, beg, end):
re_casenum = re.compile(".*<CASE_NUM>(.*)<\\/CASE_NUM>")
re_tag_val = re.compile(".*<(\\w*)>(.*)<.*")
id_ = None
tags = []
vals = []
for count, line in enumerate( open(self.r_location) ):
if beg < count < end:
if re_casenum.match(line):
m = re_casenum.match(line)
id_ = m.group(1)
if re_tag_val.match(line):
m = re_tag_val.match(line)
tags.append( m.group(1) )
vals.append( m.group(2) )
beg = end +1
print {id_ : dict(zip(tags, vals)) }
# {32145698 : {'POST_CODE': 'W1 11A', 'SURNAME': 'II', 'NAME': 'ELIZABETH', 'TITLE': 'MISS', 'ADDRESS1': '1 BUCKINGHAM PALACE', 'ADDRESS2': 'LONDON', 'ADDRESS3': 'GREATER LONDON', 'RECORD_TYPE': '1', 'CASE_NUM': 'Q1QQ1234', 'LAST_UPDATE_DATE': '2016-12-12', 'ID': '32145698'}}
self.record_splitter(beg)
if __name__ == '__main__':
inst_fol = record_manager(file)
recordManager.record_splitter(inst_folder, 0)
Моя проблема в том, что я не знаю, как зациклить 'умолять' вернуться к record_splitter
вне функций / из main :
if __name__ == '__main__':
inst_fol = record_manager(file)
beg, end = recordManager.record_splitter(inst_folder, 0)
Это "зацикливание внутри функций", и если нет, то какой подход лучше?