Python:将字符串转换为变量及其值

时间:2016-04-01 09:37:09

标签: python xml exec

我在Python上比较新。

我正在编写的程序使用while循环逐行读取XML文件。读取的数据是分开的,因此我获得的信息类似于:

datas = ['Name =“Date”','Tag =“0x03442333”','Level =“Acquisition”','Type =“String”']

- 在我的程序中,我想分配一些变量,这些变量完全被称为=符号之前的单词,前面字符串中=符号之后的信息。然后我将它们作为一个类的属性介绍(这已经有效) - 到目前为止我做了什么:

Name = ''
Tag = ''
Level = ''
Type = ''

for i in datas:
    exec(i)

- 这样做很好。但是,我不想使用exec函数。还有其他办法吗?

谢谢

4 个答案:

答案 0 :(得分:1)

exec通常是解决这个问题的方法。您也可以直接将其添加到globals()词典中,但有时会有点危险。

for pair in datas:
    name, value = pair.split("=")
    globals()[name] = eval(value)

答案 1 :(得分:1)

出于安全原因,您应该避免使用exec,并且您应该将字段值保留在dict或类似的结构中。让Python库完成整个解析会更好。例如,使用ElementTree

import xml.etree.ElementTree as ET
tree = ET.parse('myfile.xml')
root = tree.getroot()

然后迭代root及其子项,具体取决于XML数据的确切程度。

答案 2 :(得分:0)

这里讨论的最多是你期望做的事情。 To convert string to variable name

但理想情况下,您应该创建一个词典。像这样。

for i in datas:
    (key,value)=i.split("=")
    d[key] = eval(value)

注意:仍然避免使用eval。

答案 3 :(得分:0)

正如Pelle Nilsson所说,你应该使用适当的XML解析器。但是,如果数据很简单并且XML文件的格式稳定,那么可以手动执行。

您是否有特殊理由将此数据放入课堂?您可能只需要一本字典:

datas = ['Name="Date"', 'Tag="0x03442333"', 'Level="Acquisition"', 'Type="String"']

datadict = {}
for s in datas:
    key, val = s.split('=')
    datadict[key] = val.strip('"')

print(datadict)

<强>输出

{'Tag': '0x03442333', 'Type': 'String', 'Name': 'Date', 'Level': 'Acquisition'}

如果您愿意,可以将这样的字典传递给类:

class MyClass(object):
    def __init__(self, data):
        self.__dict__ = data

    def __repr__(self):
        s = ', '.join('{0}={1!r}'.format(k,v) for k, v in self.__dict__.items())
        return 'Myclass({0})'.format(s)

a = MyClass(datadict)
print(a)
print(a.Name, a.Tag)

<强>输出

Myclass(Tag='0x03442333', Type='String', Name='Date', Level='Acquisition')
Date 0x03442333

本答案中的所有代码都应该可以在任何最新版本的Python 2以及Python 3上正常运行,但如果你在Python 2上运行它应该放

from __future__ import print_function

位于脚本的顶部。