如何在Python中将字符串转换为函数?

时间:2015-02-27 14:06:18

标签: string csv python-3.x type-conversion

我必须处理来自摄像机的csv图像数据,该摄像机使用标头导出数据。该标题是将CCD计数转换为功率密度的简单功能。该等式包括暗偏移水平以及校准因子。以下是图像文件的一行示例:

  

功率密度,=,(n - 232)* 4.182e-005 W / cm ^ 2

注意逗号。可以预期csv标头每次具有相同的结构,具有用于暗电平(232)和功率密度转换(4.182e-005)的不同常数。

我希望能够抓住最后一个单元格,最后剥离单元(W / cm ^ 2),并使用剩下的内容在Python中定义一个函数。像

这样的东西
f = lambda n: '(n - 232) * 4.182e-005'

有可能这样做吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:1)

使用eval

execcompile都是将代码作为文本动态转换为已编译函数的方法。如果动态创建新函数,则只需要进行一次转换。

row = "Power Density,=,(n - 232) * 4.182e-005 W/cm^2".split(',')
expr = row[2].replace( ' W/cm^2', '')
# f = eval("lambda n:" + expr)  # based on your original idea
exec("def f(n): return " + expr)  # more flexible
print(f(0))
# -0.00970224

除了f。 name 之外,lambda eval和def exec具有相同的结果,但通常情况下,def形式更灵活,即使这里不需要灵活性。

关于执行不受信任的代码的常见警告适用。如果您正在处理不属于您自己的照片文件,并且担心对手会为您提供中毒文件,那么您确实可能需要对expr进行标记,并检查是否只有令牌。

答案 1 :(得分:0)

我找到了一种使用eval的方法,但我希望它不是非常pythonic所以我仍然有兴趣看到其他答案。

此处row是来自csv.reader对象的感兴趣的行,即我在问题中发布的相同字符串,以逗号分隔。

# Strip the units from the string
strng = row[2].replace( ' W/cm^2', '')
# Define a function based on the string
def f( n):
    return eval( strng)
# Evaluate a value
print( f( 0))
# Returns: -0.00970224