2016-05-12 47 views
0

我想创建一个文件一样 -列表使用Python和数据库

{ 
    "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(长和LAT)并创建另一个列表。

回答

0

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

从你期望的输出,它看起来像你希望你的Location字段的值是一个字典,而不是一个列表。鉴于此,并假设指数4和row 5将始终代表你的latlong列,分别,可以做到以下几点:

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

您的示例输出显示你想经度是一个字符串和纬度是一个整数。我认为这是一个错字,但如果不是,可以分别使用int(row[4])str(row[5])来确保这些值分别为latlong。此外,如果您更愿意使用Location字典的密钥列名称,则可以分别用header[4]header[5]替换latlong

您还必须更改循环以确保不会在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。当有很多行时,这将有助于减少内存使用量。

+0

令人惊叹!谢谢 – Judi

+0

@Judi,我很高兴这有帮助。如果它回答你的问题,你能将这个答案标记为接受的答案吗?这有助于显示其他人搜索类似的问题。干杯。 – Clandestine