【问题标题】:Read all lines between two string读取两个字符串之间的所有行
【发布时间】:2020-03-11 09:47:06
【问题描述】:

我想从 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

问题是它仍然只返回包含&lt;userData&lt;/userData&gt; 的行 如何修改它以获得这两个“单词”之间的线条

【问题讨论】:

  • 对于包含 'userData''userData' 的字符串,您只有 if 语句,因此您需要添加另一个 ifelse 语句或使用一些默认代码。
  • 查看stackoverflow.com/questions/1912434/… 并了解有关使用 Python 的 XML 解析库的信息。

标签: python readlines


【解决方案1】:

假设您的文件中有一个&lt;userData&gt; 块,您可以通过以下方式提取块内的行:

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 已停用。

【讨论】:

  • inblock 在 "/userData" 之后为 True,因为它也与 "userData" 匹配。我也没有想到...
【解决方案2】:

简单的方法是添加一个变量,它告诉你是否在这些词之间:

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

【讨论】:

  • 您可以将if t 移到末尾。或者改一下顺序,比如@常烨的回答
  • 正确,但是,我认为 /userData -line print 是预期的功能(-如果不是,我将注释添加到代码中)
  • 改变了如果“userData”顺序和另一个if to elif
【解决方案3】:

您可以使用itertools.dropwhile 到达&lt;userData 部分,然后使用itertools.takewhile 读取直到&lt;/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))

如果您想跳过&lt;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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多