2017-04-10 34 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