将列表中存在的文字转换为浮点数时如何处理异常?
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
。
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
。