我在Python上比较新。
我正在编写的程序使用while循环逐行读取XML文件。读取的数据是分开的,因此我获得的信息类似于:
datas = ['Name =“Date”','Tag =“0x03442333”','Level =“Acquisition”','Type =“String”']
- 在我的程序中,我想分配一些变量,这些变量完全被称为=符号之前的单词,前面字符串中=符号之后的信息。然后我将它们作为一个类的属性介绍(这已经有效) - 到目前为止我做了什么:
Name = ''
Tag = ''
Level = ''
Type = ''
for i in datas:
exec(i)
- 这样做很好。但是,我不想使用exec函数。还有其他办法吗?
谢谢
答案 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
位于脚本的顶部。