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

Python 如何在将列表中的文本转换为浮点时处理异常?,python,list,floating-point,type-conversion,strip,Python,List,Floating Point,Type Conversion,Strip,我有一个列表,上面显示了一些值。当我尝试使用pandas添加到excel工作表时,它是作为文本而不是浮点或int添加的。我想删除引号,这样它就不会在excel工作表中被视为文本,我知道可以使用split完成,如果我尝试将所有这些转换为浮点,它为这个'01:1'元素抛出一个异常,表示float的文本无效。我如何处理这个问题 您可以从ast模块中使用literal\u eval并使用try。。。除此示例中的块外: A=[None, '0.50', '2', '4', '6', '0', '0', '

我有一个列表,上面显示了一些值。当我尝试使用pandas添加到excel工作表时,它是作为文本而不是浮点或int添加的。我想删除引号,这样它就不会在excel工作表中被视为文本,我知道可以使用split完成,如果我尝试将所有这些转换为浮点,它为这个'01:1'元素抛出一个异常,表示float的文本无效。我如何处理这个问题

您可以从ast模块中使用literal\u eval并使用try。。。除此示例中的块外:

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

更简单的解决方案是在try except中包装for主体,如果特定迭代失败,则追加None或原始值elem:

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]
当elem不能解析为float时,将抛出ValueError,而当elem为None时,将抛出TypeError

这样,您就不需要检查elem是否未使用,以及是否可以一致地处理这两个异常(假设这是您想要的)

请注意,不需要.strip,因为它实际上什么都不做

返回删除前导字符和尾随字符的字符串副本

也就是说,它将尝试从值的开始和结束处删除,但没有一个值以两个单引号开始或结束。实际上,它们中的任何一个都包含引号,它们周围的引号只是表示字符串的方式,但不是其值的一部分


而且,将自动负责将数字“1”的字符串表示形式转换为浮点数。

您是否关心项0 1:1?您想对“0 1:1”执行什么操作?您提到熊猫-您是否查看并指定了errors='concure'?因此,我尝试使用元素树解析xml文件,并尝试将所有值附加到列表该xml文件具有这些值。因此我无法避免这些值。我希望在列表中保留01:1,但不希望它们为零。@user1681102然后使用Exception块中注释掉的代码:B.appendelemYes,只有那些实际为数字的值才会转换为浮点值。其余的将保持不变。我不能对此进行投票,只要它有一个:使用一个空的除外:几乎从来都不是一个好主意:除外TypeError,ValueError:好多了。我得到TypeError:“list”对象不可调用。你运行了我在回答中给出的相同示例吗?或者你有不同的输入?因为这个例子运行得很好,没有任何错误。这个例子应该运行得没有任何错误,并且给出了与我在Python3I中给出的相同的输出。我正在使用python2.7.10I。我只是在python2.7.12中再次测试代码,它工作得很好。
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)