Python - 将字符串转换为float(传统方法,float(),在这种情况下不起作用)

时间:2013-04-24 20:11:34

标签: python type-conversion

在处理我们的一些数据时,我必须执行非常基本的条件组合列。填充空值后,尝试添加到新变量赋值中的列。其中一列最终成为了对象,这一点根本不是前所未有的。然而,我发现,看似有效的值不会转换为浮点数(例如4,789.67)。经过多次搜索,似乎我所看到的每个解决方案都指出存在不规则的字符(这并不能描述我的情况)。因此,我尝试在IPython中尝试重新创建错误,并且我成功了。但是,我不明白为什么会出现这个错误:

TEST

z='4,534.07' #initial assignment
print z
print type(z) #checked type
print repr(z) #tried to reveal hidden characters
print repr(z.replace("'","")) #tried to remove excess quotes
print z[1:-1] #tried again to remove excess quotes
print float(z) #failed conversion attempt

输出

4,534.07
<type 'str'>
'4,534.07'
'4,534.07'
,534.0


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-70-8a3c46ebe6ab> in <module>()
      6 print z[1:-1]
      7 print z
----> 8 print float(z)

ValueError: invalid literal for float(): 4,534.07

我在基本转换问题中看到的解决方案总是建议将'x'转换为float - &gt;&gt;浮动(X)。我会非常感谢任何能够解释我错过的人。 (我之前没有发生这种情况。)

我一直在使用Enthought平台:


发行说明 Canopy 1.0.0.1160

Canopy 1.0.0

首次发布。请参阅文档浏览器,Canopy用户指南以了解发行版 说明新内容和任何已知问题和解决方法的说明


由于

2 个答案:

答案 0 :(得分:4)

唯一的问题是你必须删除逗号。 4,534.07不是有效的浮点字面值,但4534.07是。

(这正是ValueError: invalid literal for float(): 4,534.07告诉你的,除了它错过了“你的意思是......?”的建议。)

所以:

z='4,534.07'
print float(z.replace(',', ''))

此外,所有这些“删除多余引号”的尝试都不会做任何事情,因为字符串中没有引号。当然,当你打印出字符串的repr时会有引号,但这并不意味着它们在字符串本身中,这意味着任何字符串的repr都包含在一个额外的字符串中一对报价。因为这些引号不在字符串中,所以它们不能影响你在该字符串上调用的任何函数(除非该函数确实做了一些非常愚蠢的事情,比如在其参数上调用repr来构建要调用的字符串eval on ...)。

另外,即使问题 多余的引号,只有print z[1:-1]print z.replace("'", "")实际上不会从z ,如果您这样做,它会打印出它会是什么样子。要实际更改z的值,您必须为其指定一些内容。例如,如果您向现有代码添加print z.replace(',', ''),则float(z)仍会失败。但是,如果您添加z = z.replace(',', ''),那么float(z)将会成功。

答案 1 :(得分:0)

我会用re来替换任何不是数字或点的东西。像

>>> import re
>>> float(re.sub(r'[^0-9.]', '', '1.234,567'))
1.234567

如果你关心标志,那么在你的模式中包括 - 和+

float(re.sub(r'[^-+\d.]', '', '-1.234,567'))