Python:对不是整数文字的字符串使用int()

时间:2014-01-24 08:24:21

标签: python string numpy

注意:我的数据使用了错误的源文件 - 一旦修复,我的问题就解决了。事实证明,没有简单的方法可以在不是整数文字的字符串上使用int(..)

这是“机器学习在行动”一书中的一个例子,我无法弄清楚出了什么问题。这是一些背景知识:

from numpy import as *

def file2matrix(filename):
    fr = open(filename)
    numberOfLines = len(fr.readlines())
    returnMat = zeros((numberOfLines,3))
    classLabelVector = []
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1])) # Problem here.
        index += 1
    return returnMat,classLabelVector

.txt文件如下:

40920   8.326976    0.953952    largeDoses
14488   7.153469    1.673904    smallDoses
26052   1.441871    0.805124    didntLike
75136   13.147394   0.428964    didntLike
38344   1.669788    0.134296    didntLike
...

我在行classLabelVector.append(int(listFromLine[-1]))上收到错误,因为我相信,int(..)正在尝试解析一个不是文字整数的字符串(即"largeDoses")。我错过了什么吗?

我查找了int()的文档,但它似乎只解析了数字和整数文字:

http://docs.python.org/2/library/functions.html#int

另外,本书的摘录解释了本节如下:

  

最后,循环遍历文件中的所有行,并使用line.strip()去掉返回行字符。接下来,拆分线   进入由制表符分隔的元素列表:'\ t'。你拿   前三个元素并将它们推入矩阵的一行,并且   您使用负索引的Python功能来获取最后一项   从列表中放入classLabelVector。你必须明确   告诉解释器你想要最后一个的整数版本   列表中的项目,或者它将为您提供字符串版本。通常情况下,   你必须这样做,但NumPy会为你处理这些细节。

2 个答案:

答案 0 :(得分:3)

像“largeDoses”这样的字符串无法转换为整数。在that code projectCh02文件夹中,您有两个数据文件,使用第二个datingTestSet2.txt而不是加载第一个

答案 1 :(得分:1)

您可以使用ast.literal_eval并捕获异常ValueError格式错误的字符串(顺便说一句int('9.4')将引发异常)