使用 python 和数据库在列表中列出

List inside a List using python and Database

我希望创建一个类似 --

的文档
{ 
    "name" : "John" , 
    "DOB" : "21-Jun-1999" , 
    "Sex" : "M" ,
    "Skill" : ["C","PYTHON","COBOL"],
    "Location" : { "lat":12.3 , "Long" : "14.6" }
} 

我正在使用 cx_oracle 从我的数据库中提取数据。 这是我的代码的一小部分 --

cur1.execute('select name,dob,sex,skills,long,lat from employee');    
# to create the keys             
for i in range(len(cur1.description)):
        head=cur1.description[i][0]
        header = header + [head]
for row in cur1.fetchall():
        data_dict={}
        for i in range(len(row)):
                if i == 3 :
                        c={}
                        c=row[i]
                        c=c.split(',')
                        for j in range(len(c)):
                       data_dict.setdefault(header[i],[]).append(c[j])       
                else:
                         data_dict.setdefault(header[i],[]).append(row[i])
print(data_dict) 

这是输出--

{
    "name" : "John" , 
    "DOB" : "21-Jun-1999" , 
    "Sex" : "M" ,
    "Skill" : ["C","PYTHON","COBOL"]
}

如何从我的 SQL(long 和 lat)转换最后两个字段并创建另一个列表。

我没有安装 cx_oracle,所以没有测试但是...

从您想要的输出来看,您似乎希望 Location 字段的值是字典,而不是列表。鉴于此,并假设 row 的索引 4 和 5 将始终分别代表您的 latlong 列,您可以执行以下操作:

data_dict['Location'] = {'lat': row[4], 'long': row[5]}

您的示例输出显示您希望经度为字符串,纬度为整数。我假设这是一个打字错误,但如果不是,您可以通过对 latlong 分别使用 int(row[4])str(row[5]) 来确保这些值。此外,如果您更喜欢使用列名作为 Location 字典的键,您可以分别将 latlong 替换为 header[4]header[5] .

您还必须更改循环以确保您不会在 data_dict 中为 latlong 添加其他字段。并确保你用 data_dict 做一些事情,这样它就不会在每次循环迭代后都被破坏:

对于 Python2.7 及更高版本:

records = []
for row in cur1.fetchall():
    data_dict = {header[i]: row[i] for i in range(len(row)) if i < 3}
    data_dict[header[3]] = row[3].split(',')
    data_dict[‘Location’] = {header[4]: row[4], header[5]: row[5]}        
    records.append(data_dict)

Python2.6 及之前:

records = []
for row in cur1.fetchall():
    data_dict = { 
        header[3]: row[3].split(',')
        'Location': {header[4]: row[4], header[5]: row[5]}
    }   
    for i in range(len(row)):
        if i < 3 : 
            data_dict[header[i]] = row[i]

   records.append(data_dict)

就其价值而言,我相信 cur1 是一个迭代器,您可以简单地执行 for row in cur1。当有很多行时,这将有助于减少内存使用量。