如何在python/mongodb/elementTree中将列表项转换为各自的dict

如何在python/mongodb/elementTree中将列表项转换为各自的dict,python,mongodb,dictionary,elementtree,Python,Mongodb,Dictionary,Elementtree,我是python新手。现在是Python 2.7 我正在elementTree中处理xml并使用Mongodb。 我要处理的XML为“” 下面是代码: import os import cgi import sqlite3 as litefire import sys sys.stderr = sys.stdout from xml.etree import ElementTree from pymongo import Connection connc2=Connection('localho

我是python新手。现在是Python 2.7

我正在elementTree中处理xml并使用Mongodb。 我要处理的XML为“” 下面是代码:

import os
import cgi
import sqlite3 as litefire
import sys
sys.stderr = sys.stdout
from xml.etree import ElementTree
from pymongo import Connection
connc2=Connection('localhost',27017)
db2=connc2['rss']
rss=db2.rss

xmlrss=[]
treexsdr = ElementTree.parse('xbrlrss_all.xml')
i=0
k=0
o=0
o2=0
iter = treexsdr.getiterator()

for element in iter:
    if element.tag:
        o=i+k
        xmlname=element.tag
    if element.keys():
        attributedict = dict(element.items())
        for name, value in element.items():
            krishna=element.items()
    if element.text:
        text = element.text

    xmlnamelist={"xmlname":xmlname,"text":text,"ownid":o,"parentid":o2,"xmlattkeys":{k:v for k,v in krishna}}

    xmlrss.append(xmlnamelist)

    if element.getchildren():
        o2=o
        for child in element:
            k=k+1
    i=i+1

rss.insert(xmlrss)
当我应用krishna=dict(element.items())时,在IDE中得到的错误消息如下:

但是我想要

{
  "_id" : ObjectId("4f69bb6e17ea930fd803a958"),
  "text" : "en-us",
  "xmlname" : "language",
  "xmlattkeys" : {"href":"http://www.sec.gov/Archives/edgar/xbrlrss.all.xml", "type":"application/rss+xml", "rel":"self"},
  "parentid" : 2,
  "ownid" : 16
}

请帮我做这件事。

你可以使用听写理解:

xmlnamelist={"xmlname":xmlname,"text":text,"xmlattkeys": {k:v for k,v in krishna}}

您可以使用听写理解:

xmlnamelist={"xmlname":xmlname,"text":text,"xmlattkeys": {k:v for k,v in krishna}}
而不是

for name, value in element.items():
    krishna=element.items()

(也许可以考虑使用一个更描述性的名称来命名这个变量)

而不是

for name, value in element.items():
    krishna=element.items()

(也许可以考虑使用一个更为描述性的名称来命名这个变量)

你可以试试这个

 xmlnamelist={"xmlname":xmlname,"text":text,"xmlattkeys":dict(krishna)}
特殊表格(iterables列表)应允许。 还有一些更正:

for element in iter:
    xmlname = element.tag if element.tag else ""
    attributedict = dict(element.items()) if element.keys() else {}
    text = element.text if element.text else ""
    xmlnamelist = {"xmlname"    :xmlname,
                   "text"       :text,
                   "xmlattkeys" :attributedict}
    xmlrss.append(xmlnamelist)
请注意,您需要提供默认值,否则可能会导致变量未声明或未填充旧(假)值。

您可以尝试此方法

 xmlnamelist={"xmlname":xmlname,"text":text,"xmlattkeys":dict(krishna)}
特殊表格(iterables列表)应允许。 还有一些更正:

for element in iter:
    xmlname = element.tag if element.tag else ""
    attributedict = dict(element.items()) if element.keys() else {}
    text = element.text if element.text else ""
    xmlnamelist = {"xmlname"    :xmlname,
                   "text"       :text,
                   "xmlattkeys" :attributedict}
    xmlrss.append(xmlnamelist)


请注意,您需要提供默认值,否则可能会导致变量未声明或未用旧(假)值填充。

dict(krishna)”的问题是,当我运行程序时,它会在显示键不包含的点停止这是我的XML sec.gov/Archives/edgar/usgaap.rss.XML,错误消息是消息文件名行位置回溯D:\test\mongo_rss.py 52 insert C:\Python26\lib\site packages\pymongo\collection.py 310 InvalidDocument:key“{sec.gov/Archives/edgar}File”不能包含“”。-用户1283171 11秒前我也应用了此解决方案。。。但问题仍然与我在主要帖子中提到的一样(@user1283171:可能有点晚了,但我要提醒你,你应该检查你放入数据库的字典。因为错误消息说你不能在这本字典的键中使用“.”,因为mongodb使用的是访问这些元素的结构。似乎一个url恰好是一个键。你是对的!!!我的url包含“”这是不允许的!!无论如何…我在插入它们之前已经将它们转换为列表!dict(krishna)“的问题是当我运行程序时,它会在显示键不包含的点停止。”这是我的XML sec.gov/Archives/edgar/usgaap.rss.XML,错误消息是消息文件名行位置回溯D:\test\mongo_rss.py 52 insert C:\Python26\lib\site packages\pymongo\collection.py 310 InvalidDocument:key'{sec.gov/Archives/edgar}文件“不得包含”-user1283171 11秒前我也应用了此解决方案…但问题仍然与我在主要帖子中提到的相同(@user1283171:可能有点晚了,但我要提醒你,你应该检查你放入数据库的字典。因为错误消息说你不能在这本字典的键中使用“.”,因为mongodb使用的是访问这些元素的结构。似乎一个url恰好是一个键。你是对的!!!我的url包含“”这是不允许的!!无论如何…在插入它们之前,我已经将它们转换为列表!dict(element.items())的问题是当我运行程序时,它会在显示键不包含的点停止+1.值得指出的是,OP的代码创建和重新创建
krishna
的次数与其中的项目一样多…它会以“InvalidDocument:key'{}file'不能包含”的错误停止。@user1283171:哪一行触发此错误消息?我高度怀疑,
dict()
会抱怨键中的
。@user1283171:这看起来像是MongoDB错误,所以它与您的初始要求无关。“dict(element.items())”的问题是当我运行程序时,它会在显示键不包含的点停止”。“+1.值得指出的是,OP的代码创建和重新创建
krishna
的次数与其中包含的项目的次数相同……它以错误停止,错误为“InvalidDocument:key'{}file'不能包含”。@user1283171:哪一行触发了此错误消息?我非常怀疑,
dict()
会抱怨键中的
。@user1283171:这看起来像是MongoDB错误,因此与您的初始需求无关。您使用的是哪种Python版本?另外,@larsman的解决方案是一种方法-立即创建正确的数据结构,而不是将其转换为列表再转换回来。好的,那么您没有字典y理解。它们是在Python3中添加的,并被后传到python2.7中。为什么要使用过时的Python版本?I python2.7,问题仍然存在。我已经更新了我的主要帖子,请查看一下……您使用的是哪种Python版本?另外,@larsman的解决方案是一种方法-立即创建正确的数据结构没有将其转换为列表并返回。好的,那么您就没有字典理解。它们是在Python 3中添加的,并向后移植到Python 2.7中。为什么您要使用过时的Python版本?I python2.7,问题仍然是这样。我已经更新了我的主要帖子,请查看一下……如果您在xmlrs中为e编写:
,会发生什么s:rss.insert(e)
结尾?问题仍然是一样的……它显示了“.”的问题,正如我在主要帖子中提到的那样(我不知道。我读了一些关于批量插入的问题的文章,因此值得一试。您应该在代码中添加xmlrss内容的打印输出,以便我们知道插入函数的内容。如果您在xmlrss中为e编写:
:rss.insert(e)
,最后会发生什么?问题仍然是一样的……它显示了”的问题。“正如我在主要帖子中提到的……(我不知道。我读了一些关于批量插入问题的文章,因此值得一试。您应该在代码中添加xmlrss内容的打印输出,以便我们了解插入函数的内容。