我想使用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