Читать все строки между двумя строками - PullRequest
0 голосов
/ 11 марта 2020

Я хочу извлечь строки из xml между моими xml. Вот пример:

<userData code="viPartListRailML" value="1">
            <partRailML s="0.0000000000000000e+00" id="0"/>
            <partRailML s="2.0000000000000000e+01" id="1"/>
            <partRailML s="9.4137883373059267e+01" id="2"/>
        </userData>

Вот мой код, который я пробовал:

import re

shakes = open("N:\SAJAT_MAPPAK\IGYULAVICS\/adhoc\pythonXMLread\probaxml\github_minta.xml", "r")
for x in shakes:
    if "userData" in x:
        print x
        continue
    if "/userData" in x:
        break

Проблема в том, что он по-прежнему возвращает только строки, содержащие <userData или </userData> Как изменить его, чтобы получить строки между этими двумя "словами"

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Простой способ - добавить переменную, которая сообщает, что вы находитесь между этими словами:

shakes = open("N:\SAJAT_MAPPAK\IGYULAVICS\/adhoc\pythonXMLread\probaxml\github_minta.xml", "r")
t=False
for x in shakes:
    if t:
        print(x) # also /userdata -line is printed
    if "/userData" in x:
        t=False
    elif "userData" in x: # this matches /userData as well--> elif
        t=True
1 голос
/ 11 марта 2020

Предполагая, что в вашем файле есть один <userData> блок, вы можете извлечь строки внутри блока следующим образом:

shakes = open("./file.xml", "r")
inblock = False
for x in shakes:
    if "/userData" in x:
        inblock = False
    if inblock:
        print(x)
    if "userData" in x:
        inblock = True

Но читать ваш файл с помощью синтаксического анализатора xml более надежно, например:

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')

for data in tree.getroot().iter('userData'):
    for child in data:
        print(ET.tostring(child))
        # or something else, eg:
        # print(child.tag)

Кстати, используйте Python3, когда это возможно, Python2 удаляется.

0 голосов
/ 11 марта 2020

Вы можете использовать itertools.dropwhile для достижения части <userData, а затем использовать itertools.takewhile для чтения до </userData:

import itertools as it

result = it.takewhile(
    lambda x: '</userData' not in x,
    it.dropwhile(
        lambda x: '<userData' not in x,
        text.splitlines()
    )
)
print('\n'.join(result))

Если вы хотите пропустить элемент <userData, вы можете добавить itertools.islice:

result = it.takewhile(
    lambda x: '</userData' not in x,
    it.islice(it.dropwhile(
        lambda x: '<userData' not in x,
        text.splitlines()
    ), 1, None)
)
print('\n'.join(result))
...