从python数组格式化数据
我是第一次学习python。 我的目标是从API获取数据并将其输出为xml 输出存储在一个数组(“projectData”)中,下面是一个输出示例:从python数组格式化数据,python,Python,我是第一次学习python。 我的目标是从API获取数据并将其输出为xml 输出存储在一个数组(“projectData”)中,下面是一个输出示例: [{'code': 'demo', 'created_at': datetime.datetime(2008, 6, 11, 7, 35, 19, tzinfo=<api.LocalTimezone object at 0x10072ab10>), 'created_by': None, 'id': 4, 'image': 'h
[{'code': 'demo',
'created_at': datetime.datetime(2008, 6, 11, 7, 35, 19, tzinfo=<api.LocalTimezone object at 0x10072ab10>),
'created_by': None,
'id': 4,
'image': 'https://website.com/files/0000/0000/blah.jpg',
'name': 'Demo Project',
'description': 'This is for demonstration purposes',
'due': '2009-05-30',
'start': '2009-05-06',
'status': 'Active',
'stype': 'Demo',
'tag_list': [],
'type': 'Project',
'updated_at': datetime.datetime(2009, 5, 27, 1, 41, 55, tzinfo=<api.LocalTimezone object at 0x10072ab10>),
'updated_by': {'id': 24, 'name': 'Test', 'type': 'HumanUser'},
'users': [{'id': 19, 'name': 'User 1', 'type': 'HumanUser'},
{'id': 18, 'name': 'User 2', 'type': 'HumanUser'},
{'id': 17, 'name': 'User 3', 'type': 'HumanUser'},
{'id': 16, 'name': 'User 4', 'type': 'HumanUser'},
{'id': 15, 'name': 'User 5', 'type': 'HumanUser'},
{'id': 14, 'name': 'User 6', 'type': 'HumanUser'},
{'id': 13, 'name': 'User 7', 'type': 'HumanUser'},
{'id': 12, 'name': 'User 8', 'type': 'HumanUser'},
{'id': 20, 'name': 'Client 1', 'type': 'HumanUser'}]},
[{'code':'demo',
'created_at':datetime.datetime(2008,6,11,7,35,19,tzinfo=),
“创建人”:无,
“id”:4,
'图像':'https://website.com/files/0000/0000/blah.jpg',
“名称”:“演示项目”,
'说明':'这是为了演示',
‘到期’:‘2009-05-30’,
‘开始’:‘2009-05-06’,
“状态”:“活动”,
'stype':'Demo',
“标签列表”:[],
“类型”:“项目”,
'updated_at':datetime.datetime(2009,5,27,1,41,55,tzinfo=),
'更新者':{'id':24,'名称':'测试','类型':'人类用户'},
'users':[{'id':19,'name':'User 1','type':'HumanUser'},
{'id':18,'name':'User 2','type':'HumanUser'},
{'id':17,'name':'User 3','type':'HumanUser'},
{'id':16,'name':'User 4','type':'HumanUser'},
{'id':15,'name':'User 5','type':'HumanUser'},
{'id':14,'name':'User 6','type':'HumanUser'},
{'id':13,'name':'User 7','type':'HumanUser'},
{'id':12,'name':'User 8','type':'HumanUser'},
{'id':20,'name':'Client 1','type':'HumanUser'}]},
(等等)
我编写了一些代码,将其输出为xml,如下所示:
for _project in projectData:
print "<Project>"
for key in _project:
value = _project[key]
print "\t<" + str(key) + ">" + str(value) + "</" + str(key) + ">"
print("</Project>\n")
projectData中的_项目的:
打印“”
对于关键项目:
值=_项目[键]
打印“\t”+str(值)+”
打印(“\n”)
这实际上给了我一个对我有用的结果
然而,由于我对这一点还不熟悉,我怀疑这不是一种非常有效的方法,并且可能容易受到各种错误的影响,我希望更有知识的人能为我提供一些指导。接下来我想尝试使用它,使其递归,以便“updated_by”元素返回自己的xml
谢谢。考虑使用类似或代替手工构建XML。考虑使用类似或代替手工构建XML。考虑使用某种模板工具(甚至
string.template
)代替大量的字符串操作
例如,使用愚蠢的小内置模板类,要标记的通用字典非常简单
import string
tag= string.Template( "<$tag>$value</$tag>" )
for k,v in someProjectDictionary:
print tag.substitute( key=k, value=v )
考虑使用某种模板工具(甚至
string.template
)而不是大量的字符串操作
例如,使用愚蠢的小内置模板类,要标记的通用字典非常简单
import string
tag= string.Template( "<$tag>$value</$tag>" )
for k,v in someProjectDictionary:
print tag.substitute( key=k, value=v )
下面是一个使用
lxml.etree
的示例,不完整..可能有点幼稚。实际上,您应该定义一个模式,并确保输出与之一致
编辑,说它是不完整的,添加了None类型,并假设一个created_by在填充时就像一个更新的_by
下面是一个使用
lxml.etree
的示例,不完整..可能有点幼稚。实际上,您应该定义一个模式,并确保输出与之一致
编辑,说它是不完整的,添加了None类型,并假设一个created_by在填充时就像一个更新的_by
eTree已经与Python一起发布,因此我认为这是最好的起点,在出现不同的需求之前,它似乎适合于此项工作。eTree已经与Python一起发布,因此我认为这是最好的起点,在出现不同的需求之前,它似乎适合于此项工作。Jinja和/或Mako是否保证输出将是格式良好的XML?或者他必须知道如何转义其值中的特殊字符吗?@Robert Rossney:它们只是模板引擎;保证很少。Jinja提供了几种转义机制。通常,自动转义是您使用的。Jinja和/或Mako是否保证输出是格式良好的XML?或者他必须知道转义sp罗伯特·罗斯尼:他们只是模板引擎;保证很少。金贾提供了几种转义机制。一般来说,自动转义就是你所使用的。谢谢马特,我会检查这个,看看我是否能坚持到底!谢谢马特,我会检查这个,看看我是否能坚持到底我很好奇,这个问题在我看来既不是“不清楚”也不是“没用”。如果你记下一个问题,你不应该评论为什么?我很好奇,这个问题在我看来既不是“不清楚”也不是“没用”。如果你记下一个问题,你不应该评论为什么?
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
template = env.get_template('mytemplate.html')
print template.render(project_data=the_project_data_list)
import datetime
projects = [{'code': 'demo',
'created_at': datetime.datetime(2008, 6, 11, 7, 35, 19),
'created_by': None,
'id': 4,
'image': 'https://website.com/files/0000/0000/blah.jpg',
'name': 'Demo Project',
'description': 'This is for demonstration purposes',
'due': '2009-05-30',
'start': '2009-05-06',
'status': 'Active',
'stype': 'Demo',
'tag_list': [],
'type': 'Project',
'updated_at': datetime.datetime(2009, 5, 27, 1, 41, 55),
'updated_by': {'id': 24, 'name': 'Test', 'type': 'HumanUser'},
'users': [{'id': 19, 'name': 'User 1', 'type': 'HumanUser'},
{'id': 18, 'name': 'User 2', 'type': 'HumanUser'},
{'id': 17, 'name': 'User 3', 'type': 'HumanUser'},
{'id': 16, 'name': 'User 4', 'type': 'HumanUser'},
{'id': 15, 'name': 'User 5', 'type': 'HumanUser'},
{'id': 14, 'name': 'User 6', 'type': 'HumanUser'},
{'id': 13, 'name': 'User 7', 'type': 'HumanUser'},
{'id': 12, 'name': 'User 8', 'type': 'HumanUser'},
{'id': 20, 'name': 'Client 1', 'type': 'HumanUser'}]},
]
from lxml import etree
def E(tag, parent=None, content=None, children=None, **kw):
e = etree.Element(tag)
if not content is None:
e.text = str(content)
for k,v in kw.items():
e.set(k, str(v))
if not parent is None:
parent.append(e)
if not children is None:
for c in children:
e.append(c)
return e
def processProject(data):
attrs = ('name','type','id')
p = E('Project')
for item in attrs:
p.set(item,str(data[item]))
for k,v in [ x for x in data.items() if x[0] not in attrs ]:
if v is None:
E(k,parent=p)
elif isinstance(v,basestring):
E(k,content=v,parent=p)
elif isinstance(v,(float,long,int)):
E(k,content=str(v),parent=p)
elif isinstance(v,datetime.datetime):
E(k,content=v.strftime('%Y-%m-%d %H%M'),parent=p)
elif k == 'users':
users = E(k,parent=p)
for u in v:
E('user',parent=users,**dict([ (x,str(y)) for (x,y) in u.items()]))
elif k in ('updated_by','created_by'):
E(k,parent=p,**dict([ (x,str(y)) for (x,y) in v.items()]))
elif k == 'tag_list':
taglist = E(k,parent=p)
for t in v:
E('tag',parent=taglist,content=t)
return p
>>> projxml = processProject(projects[0])
>>> etree.dump(projxml)
<Project name="Demo Project" type="Project" id="4">
<status>Active</status>
<code>demo</code>
<created_at>2008-06-11 0735</created_at>
<due>2009-05-30</due>
<created_by/>
<updated_at>2009-05-27 0141</updated_at>
<start>2009-05-06</start>
<image>https://website.com/files/0000/0000/blah.jpg</image>
<updated_by type="HumanUser" id="24" name="Test"/>
<users>
<user type="HumanUser" id="19" name="User 1"/>
<user type="HumanUser" id="18" name="User 2"/>
<user type="HumanUser" id="17" name="User 3"/>
<user type="HumanUser" id="16" name="User 4"/>
<user type="HumanUser" id="15" name="User 5"/>
<user type="HumanUser" id="14" name="User 6"/>
<user type="HumanUser" id="13" name="User 7"/>
<user type="HumanUser" id="12" name="User 8"/>
<user type="HumanUser" id="20" name="Client 1"/>
</users>
<tag_list/>
<stype>Demo</stype>
<description>This is for demonstration purposes</description>
</Project>