2017-04-10 35 views
0

我想執行從Excel工作簿中讀取的代碼。但是,由於某些原因,下面的代碼實際上並沒有進行評估。評估與Excel中的字符串不兼容

import win32com.client 
import os 

excel = win32com.client.DispatchEx('Excel.Application') 
local_dir = os.getcwd() 
book = excel.Workbooks.Open(local_dir+'\\Condition.xlsx', True) 
sheet = book.Sheets('Sheet1') 

condition = sheet.Cells(1,3).Value 

print condition 
print eval(condition) 

excel.Workbooks.Close() 

如果有問題的單元格包含「1 + 2」,上面的代碼只打印出「1 + 2」而不是「3」。如果我用「1 + 2」替換「條件」,它的評估是正確的。任何想法爲什麼這不起作用?

+2

字符串本身是否包含引號?這可能是問題...嘗試'eval(condition.strip(''')' –

+1

您的單元格包含字符串「」1 + 2「,包括引號,該字符串評估爲此字符串並提防'eval' ... –

+0

是的,這就是問題所在。謝謝!我不知道除了使用eval之外,還有什麼需要去做,我需要讓用戶定義一個沒有預定義表單的邏輯表達式或結構,它將需要API調用等 – PProteus

回答

0

我不建議您使用eval(),因爲它可以是very dangerous and harmful to your code's security

相反的,我建議你使用literal_evalast模塊:

from ast import literal_eval as eval 
# work to do ... 

所以,一個簡單的辦法,以你的代碼,以處理與像"1+3"報價和其他字符串,你可以這樣做:

from ast import literal_eval as eval 
# your actual code 
# ... 
print(eval(condition.replace('"', ''))) 
# Or 
# print(eval(condition.strip('"'))) 

編輯:

eval()和之間的差:

  • eval(my_string_or_input):評估代碼 (串/輸入/的raw_input)只要調用函數時不 檢查是否在參數的代碼是安全與否。
  • literal_eval(my_string_or_input):如果參數中的 string/input/raw_input不是有效的Python代碼,將引發異常。所以, 它不會被執行,如果有不安全的代碼。

您可以查看此question/answers in stackoverflow以獲取更多解釋。

+1

你能解釋eval和ast.literal_eval之間的區別嗎 – PProteus

+0

檢查我的答案,我已經編輯它 –

+1

還有更多的不同它literal_eval只允許一個子集的Python語法,並且它不允許你從評估中獲取全局和本地字典(我實際需要的一個特性)。 – PProteus