我必须处理来自摄像机的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'
有可能这样做吗?如果是这样,怎么样?
答案 0 :(得分:1)
eval
的 exec
和compile
都是将代码作为文本动态转换为已编译函数的方法。如果动态创建新函数,则只需要进行一次转换。
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