在处理我们的一些数据时,我必须执行非常基本的条件组合列。填充空值后,尝试添加到新变量赋值中的列。其中一列最终成为了对象,这一点根本不是前所未有的。然而,我发现,看似有效的值不会转换为浮点数(例如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用户指南以了解发行版 说明新内容和任何已知问题和解决方法的说明
由于
答案 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'))