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