将列表中存在的文字转换为浮点数时如何处理异常?

How to handle an exception while converting a literal present in a list to float?

A=[None, '0.50', '2', '4', '6', '0', '0', '0', '0.00', '0', '0', '0', '5', '1', '5', '5', '1', '1', '0', '1', '2', '2', '2', '0 (1:1)', '0', '0', '2', '2', '0', '0', '1', '2', '0']
B=[]
for elem in A:
    if elem is not None:
        B.append(float(elem.strip("''")))
    else:
         B.append(elem )
print B

我有一个列表,上面显示了值。当我尝试使用 pandas 添加到 excel sheet 时,它被添加为文本而不是浮点数或整数。我想删除引号,这样它就不会被视为 excel sheet 中的文本,我知道可以使用拆分来完成,如果我尝试将所有这些转换为浮动,它为这个“0(1:1)”元素抛出一个异常,表示 float.How 的无效文字我要处理这个吗?

您可以使用 ast 模块中的 literal_eval 并使用 try ... except 块,如下例所示:

from ast import literal_eval

A=[None, '0.50', '2', '4', '6', '0', '0', '0', '0.00', '0', '0', '0', '5', '1', '5', '5', '1', '1', '0', '1', '2', '2', '2', '0 (1:1)', '0', '0', '2', '2', '0', '0', '1', '2', '0']

def evaluate(a):
    for k in a:
        try:
            # Or if you want: use yield float(k)
            yield literal_eval(k)
        except ValueError:
            yield k
        except SyntaxError:
            yield k

>>> list(evaluate(A))
[None, 0.5, 2, 4, 6, 0, 0, 0, 0.0, 0, 0, 0, 5, 1, 5, 5, 1, 1, 0, 1, 2, 2, 2, '0(1:1)', 0, 0, 2, 2, 0, 0, 1, 2, 0]

更简单的解决方案是将 for 主体包裹在 try-except 中,并附加 None 或原始值 (elem)(如果它在特定迭代中失败) :

A = [None, '0.50', '2', '4', '6', '0', '0', '0', '0.00', '0', '0', '0', '5', '1', '5', '5', '1', '1', '0', '1', '2', '2', '2', '0 (1:1)', '0', '0', '2', '2', '0', '0', '1', '2', '0']

B = []

for elem in A:
    try:
        B.append(float(elem))
    except (ValueError, TypeError) as error:
        B.append(elem)

        # Or, if you don't want to preserve the non-numeric values:

        # B.append(None)

print(B)

elem不能被解析为float时会抛出ValueError,而当elem为[=时会抛出TypeError 13=].

就像你不需要检查 elem 是否 None 使用和 if 并且两个异常都可以一致地处理(假设这就是你想要的)。

请注意 .strip("''") 不是必需的,因为它实际上没有做任何事情。 According to the docs, strip() will...:

Return a copy of the string with the leading and trailing characters removed.

也就是说,它会尝试从您的值的开头和结尾删除 '',但您的值中有 none 以两个单引号开头或结尾。实际上,它们中的任何一个都包含引号,它们周围的只是表示字符串的方式,而不是它们值的一部分。

此外,float() 会自动将数字 ('1') 的字符串表示形式转换为 Float