2013-05-12 51 views
-1

我真的很陌生,很抱歉,如果我的問題很愚蠢。從SQL語句中,我填補了這一字典:從字典中獲取價值

config_params = [dict(
    hostname=row[0], syslocation=row[1], 
    ipaddress=socket.inet_ntoa(struct.pack('!L', row[2])), 
    netmask=socket.inet_ntoa(struct.pack('!L', row[3])), 
    username=row[4], password=row[5], bri1=row[6], bri2=row[7], 
    bri3=row[8], bri4=row[9]) for row in cur.fetchall() 
] 

現在我可以打印整個「config_params」,如:

print config_params 

如何打印「只是」從「主機名的值?它didnt't與 打印config_params [「主機」]

感謝您的幫助工作,

+2

「它沒有用」是什麼意思?你有例外嗎?如果是這樣,請向我們展示異常(帶回溯)。 – abarnert 2013-05-12 13:28:44

+0

不會工作方式,我得到這個錯誤: 類型錯誤:列表索引必須是整數,而不是str的 – Kilrathy 2013-05-12 13:30:57

+0

該錯誤告訴你'config_params'必須是'list',而不是一個'dict',這是一個有用的線索。這正是爲什麼你應該發佈實際的錯誤,而不是僅僅說「它沒有工作」。 – abarnert 2013-05-12 13:36:58

回答

1

的問題是,你沒有創建dict,你要創建行的list,每個元素這是一個dict

所以,只打印了hostname只是第一行:

print config_params[0]['hostname'] 

或者打印主機名的每一行:

for row in config_params: 
    print row['hostname'] 

...或者,如果你喜歡:

print '\n'.join(row['hostname'] for row in config_params) 

同時,如果你只在首位期待一行,只需使用fetchone,而不是遍歷fetchall

row = cur.fetchone() 
config_params = dict(
    hostname=row[0], syslocation=row[1], 
    ipaddress=socket.inet_ntoa(struct.pack('!L', row[2])), 
    netmask=socket.inet_ntoa(struct.pack('!L', row[3])), 
    username=row[4], password=row[5], bri1=row[6], bri2=row[7], 
    bri3=row[8], bri4=row[9]) 

現在你只是得到了dict


這也是值得注意的是,許多數據庫庫給你一個方法來自動創建的每一行的字典,使用列名作爲關鍵字,或一些更炫。例如,sqlite3

con = sqlite3.connect(dbpath, factory=sqlite3.Row) 
cur = con.execute('SELECT * FROM Config') 
config_params = cur.fetchone() 
print config_params['hostname'] 
+0

非常感謝,現在我明白了! – Kilrathy 2013-05-12 13:45:43

1

你有字典的名單,所以你會遍歷它們:

for param in config_params: 
    print param['hostname'] 

或訪問單個項目:

print config_params[0]['hostname'] 

,或者使用列表解析只提取主機名:

print [d['hostname'] for d in config_params]