我想使用Python 2.6和更高版本将字符串转换为浮动,但没有静默地将诸如'NaN'
和'Inf'
之类的东西转换为浮动对象。我希望它们被默默地忽略,就像任何无效的浮动表示形式的文本一样。转换字符串浮动没有沉默NaN/Inf转换
在2.6之前,float("NaN")
会在Windows上引发ValueError。现在它返回一个float,math.isnan()返回True,这对我的应用程序来说不是有用的行为。 (正如指出的那样,这一直是一个平台相关的行为,但认为这是我的目的,不管它发生的不良行为。)
下面是我在此刻得到了:
import math
def get_floats(source):
for text in source.split():
try:
val = float(text)
if math.isnan(val) or math.isinf(val):
raise ValueError
yield val
except ValueError:
pass
这是一个生成器,我可以提供包含代表实数的空白分隔序列的字符串。我希望它只产生那些纯粹是浮点数字表示的字段,如“1.23”或“-34e6”,但不是例如“NaN”或“-Inf”。根本不漂浮的东西,例如“你好”,也应该被忽略。
测试用例:
assert list(get_floats('1.23 foo -34e6 NaN -Inf')) == [1.23, -34000000.0]
请建议你考虑更优雅的选择,即使他们涉及“三思而后行”(这通常被认为是在Python较小的做法)。
编辑澄清非浮动文本,如“你好”,也应该安静地被忽略。目的是只提取那些真正的数字而忽略其他的东西。
鸡蛋里挑骨头:预2.6行为是完全依赖于平台。例如,在OS X上使用Python 2.5,float(“NaN”)返回一个nan。 – 2010-06-05 18:20:50
马克,好点;我忘了那个。正如你可能知道的那样,在Windows平台上。 – 2010-06-06 12:34:45