【问题标题】:How can I convert a string into a function in Python?如何在 Python 中将字符串转换为函数?
【发布时间】:2015-04-30 06:39:15
【问题描述】:

我必须处理来自相机的 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'

有可能吗?如果有,怎么做?

【问题讨论】:

  • 我会尝试对字符串进行一点预处理(例如去掉 W/cm^2、逗号等),然后尝试tokenize它。
  • 谢谢,我没听说过tokenize。我已经完成了预处理,所以我会研究一下。

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


【解决方案1】:

evalexec 使用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

lambda eval 和 def exec 的结果相同,除了 f.name,但和往常一样,def 形式更灵活,即使这里不需要灵活性。

适用于执行不受信任代码的常见警告。如果您正在使用不是您自己的照片文件并且担心对手向您提供有毒文件,那么您确实可能想要标记 expr 并检查是否只有预期的标记。

【讨论】:

    【解决方案2】:

    我找到了一种使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多