Python - как вложить циклы чтения файлов?
2 дня назад я был впервые представлен Python (и программирование в целом). Сегодня я застрял. Я потратил часы, пытаясь найти ответ на то, что я подозреваю, является проблемой настолько тривиальной, никто еще не застрял здесь:)
Босс хочет, чтобы я вручную очистил огромный .xml-файлы во что-то более читаемое человеком. Я пытаюсь создать сценарий, чтобы сделать это за меня. Ниже приведен пример .xml-файл, а также желаемый результат.
вход (Папка.XML-код):
<IssueTracking>
<Issue>
<SequenceNum>123</SequenceNum>
<Subject>Subject of Ticket 123</Subject>
<Description>Line 1 in Description field of Ticket 123.
Line 2 in Description field of Ticket 123.
Line 3 in Description field of Ticket 123.</Description>
</Issue>
<Issue>
<SequenceNum>124</SequenceNum>
<Subject>Subject of Ticket 124</Subject>
<Description>Line 1 in Description field of Ticket 124.
Line 2 in Description field of Ticket 124.
Line 3 in Description field of Ticket 124.</Description>
</Issue>
</IssueTracking>
Желаемый Результат:
123 Subject of Ticket 123
Line 1 in Description field of Ticket 123.
Line 2 in Description field of Ticket 123.
Line 3 in Description field of Ticket 123.
124 Subject of Ticket 124
Line 1 in Description field of Ticket 124.
Line 2 in Description field of Ticket 124.
Line 3 in Description field of Ticket 124.
вот что у меня есть до сих пор.
with open(File.xml, 'r') as SourceFile: # Opens the file
while 1: # Keep going through the file to the end
SourceFileLine = SourceFile.readline() # Saves lines of the source file
if not SourceFileLine: # Skip empty lines
break
SourceFileLine = SourceFileLine.strip() # Strips the whitespace
if "<SequenceNum>" in SourceFileLine:
SequenceNum = SourceFileLine[13:-14] # Trims the tags, saves the field.
continue
if "<Subject>" in SourceFileLine:
Subject = SourceFileLine[9:-10]
continue
#if "<Description>" in SourceFileLine:
# last_pos = SourceFile.tell()
# while "</Description>" not in SourceFileLine:
# SourceFile.seek(last_pos)
# ?????
#
# Description = Description[22:]
# continue
if "</Issue>" in SourceFileLine:
print(SequenceNum, end = "t")
print(Subject)
# print(Description)
print("n")
Я застрял в идентификации и сохранении этих трех строк между <Description>
теги в одну строку, которую я могу распечатать, прежде чем продолжить исходный файл. Теперь, просмотрев десятки других примеров циклов чтения строки файла, я подозреваю, что мне нужно отметить точку, в которой я достигаю поля назначения, и вложить другой цикл чтения в эту точку файла. но я я не нашел другого примера этого, поэтому я предполагаю, что мне не хватает чего-то основного или есть лучший способ. Заранее спасибо за помощь!
2 ответов
пример использования lxml, который я настоятельно рекомендую для обработки ваших данных. (nb: написано для Py2.x, но легко адаптируется для Py3.x)
from lxml import etree
xml = """<IssueTracking>
<Issue>
<SequenceNum>123</SequenceNum>
<Subject>Subject of Ticket 123</Subject>
<Description>Line 1 in Description field of Ticket 123.
Line 2 in Description field of Ticket 123.
Line 3 in Description field of Ticket 123.</Description>
</Issue>
<Issue>
<SequenceNum>124</SequenceNum>
<Subject>Subject of Ticket 124</Subject>
<Description>Line 1 in Description field of Ticket 124.
Line 2 in Description field of Ticket 124.
Line 3 in Description field of Ticket 124.</Description>
</Issue>
</IssueTracking>
"""
root = etree.fromstring(xml)
for issue in root.findall('Issue'):
as_list = [issue.find(n).text for n in ('SequenceNum', 'Subject', 'Description')]
as_list[2] = as_list[2].split('\n')
print as_list
принты:
['123', 'Subject of Ticket 123', ['Line 1 in Description field of Ticket 123.', 'Line 2 in Description field of Ticket 123.', 'Line 3 in Description field of Ticket 123.']]
['124', 'Subject of Ticket 124', ['Line 1 in Description field of Ticket 124.', 'Line 2 in Description field of Ticket 124.', 'Line 3 in Description field of Ticket 124.']]
пожалуйста, не читайте XML-файлы, как это, для python есть различные библиотеки, которые помогут в чтении XML-файлов.
посмотрите на библиотеку python lxml
Это обеспечивает очень простой способ читать, а затем анализировать XML-файлы, и это значительно улучшит ваш код.
Я бы объяснил, как использовать саму библиотеку, но их документация намного лучше, чем я могу втиснуть в эту текстовую область:http://lxml.de/tutorial.html