Python 如何在将列表中的文本转换为浮点时处理异常?
我有一个列表,上面显示了一些值。当我尝试使用pandas添加到excel工作表时,它是作为文本而不是浮点或int添加的。我想删除引号,这样它就不会在excel工作表中被视为文本,我知道可以使用split完成,如果我尝试将所有这些转换为浮点,它为这个'01:1'元素抛出一个异常,表示float的文本无效。我如何处理这个问题 您可以从ast模块中使用literal\u eval并使用try。。。除此示例中的块外: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', '
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)