在python中使用for循环时重置变量

时间:2019-02-01 12:49:24

标签: python xml python-3.x elementtree

我是一个相对较新的程序员,使用xml元素树来遍历成员数据的xml文件。我是通过迭代成员提取数据,并分配给了姓,名字和ID变量。

我的问题是,如果构件中的一个具有一个缺失元件(相对于缺少的元素内的数据),那么我的当前代码维护从最后一次迭代(部件)的变量的值。

我的数据:

<?xml version='1.0' ?>
<members>
    <member>
        <field name="surname">
            <text>Smith</text>
        </field>
        <field name="firstname" type="text">
            <text>John</text>
        </field>
        <field name="id" type="text">
            <text>123</text>
        </field>
    </member>
        <member>
        <field name="surname" type="text">
            <text>Bloggs</text>
        </field>

<!--missing firstname element here -->

        <field name="id" type="text">
            <text>789</text>
        </field>
    </member>
    <member>
        <field name="surname" type="text">
            <text>Jones</text>
        </field>
        <field name="firstname" type="text">
            <text>Jane</text>
        </field>
        <field name="id" type="text">
            <text>456</text>
        </field>
    </member>
</members>

我的代码:

tree = ET.parse('mydata.xml')
root = tree.getroot()
y = root.findall('member')
for member in y:
    fields = member.findall("field")
    for field in fields:
        if field.get('name') == 'surname':
            surname = field.find('text').text
        if field.get('name') == 'firstname':
            firstname = field.find('text').text
        if field.get('name') == 'id':
            id = field.find('text').text

    print(surname, firstname, id)    

所需的输出:

Smith John 123
Bloggs  789
Jones Jane 456

实际输出,其示出布罗格斯姓名为约翰而不是空白:

Smith John 123
Bloggs John 789
Jones Jane 456

我可以通过在每次成员迭代之前设置姓,名和id变量来避免这种情况:

for member in y:
    surname = ''
    firstname = ''
    id = ''

    fields = member.findall("field")
    for field in fields:
        if field.get('name') == 'surname':
            surname = field.find('text').text
        if field.get('name') == 'firstname':
            firstname = field.find('text').text
        if field.get('name') == 'id':
            id = field.find('text').text

    print(surname, firstname, id)

给出所需的结果:

Smith John 123
Bloggs  789
Jones Jane 456

但是这感觉有点变通方法-是否有另一种更Python的方式来实现这一目标?

3 个答案:

答案 0 :(得分:1)

您拥有的东西实际上还可以阅读。但是,如果您真的想要,可以使用三元表达式

for member in y:
    fields = member.findall("field")
    for field in fields:
        surname = field.find('text').text if field.get('name') == 'surname' else ''
        firstname = field.find('text').text if field.get('name') == 'firstname' else ''
        id = field.find('text').text if field.get('name') == 'id' else ''

    print(surname, firstname, id)

答案 1 :(得分:1)

通过使用dict理解将数据放入dict也许更容易实现。这样,即使由于成员中没有字段而将其完全清空,字典也将始终被覆盖:

TextField

=>

<TextInput deafultValue={groupName}
<TextInput defaultValue={description}

答案 2 :(得分:0)

最好将这些东西隔离到自己的功能中。 是的,当您需要空白字段时,应该先将其重置