2016-05-12 53 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

相關問題