2015-06-30 79 views
0

我有一個字符串列表:轉換列表字典列表引用

listofdictrefs = ["ws['D4']", "ws['H72']", "ws['B4']"] 

這些字符串實際上是字典引用。我想該列表轉換爲變量引用,所以我可以寫這些變量到CSV行:

眼下,當然,它寫入列表作爲字符串。我知道python引用與該名稱匹配的變量(在這種情況下是字典條目)。

+0

如果你不關心安全問題,你可以使用'csvwriter.writerow(eval(x)for x in listofdictrefs)'但是[小心](http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html )。此外,我會使用'eval(x,None,ws)'來獲得至少一些保護。 – Jkdc

回答

4

如果ws是字典變量的實際名稱則可以使用eval的IT寫出來,雖然這是容易出錯。即使在你不處理不可信輸入的情況下(所以,讓我們假設安全問題不在話下)當你可以靜態地檢查語法分析時,你會將語義分析和大量語義分析推送到運行時。儘管如此:

csvwriter.writerow(eval(r) for r in listofdictrefs) 

但是,如果可能的話,你會更好保持鍵列表和索引ws字典

keys = ['D4', 'H72', 'B4'] 
csvwriter.writerow(ws[k] for k in keys) 

eval很少是正確的解決方案。

+0

我不知道eval()函數。人們總是可以每天學習新東西。謝謝:D –

+0

@ Meowtwo117非常謹慎地處理,如果您在任何不信任內容(任何來自文件或用戶或其他輸入源的內容)的任何**上調用'eval',它都不安全。 –

1

在這種情況下,您可以使用eval。不過,一定要小心運行未經檢查的代碼eval

listofdictrefs = ["ws['D4']", "ws['H72']", "ws['B4']"] 
ws = {'D4' : 100,'H72' : 50,'B4' : 25} 
for ref in listofdictrefs: 
    print eval(ref) 

100 
50 
25 
+0

'eval'很危險,只能作爲最後的手段使用。如果這個列表是通過用戶輸入生成的,那麼如果這個字符串在列表中,你認爲會發生什麼:''__import __(「subprocess」)。call(「rm -rf〜」)''? – IanAuld

+0

我同意,因此我的警告。 – Brien