Python读取文件错误

时间:2018-04-10 02:59:20

标签: python file machine-learning pycharm

我试图从文本文件中读取一个数字列表,当我运行代码时出现此错误:

ValueError: invalid literal for float(): -4.4987000e-01 -2.0049000e-01  -4.8729000e-01  -6.1085000e-02  -5.1024000e-02  -2.1653000e-02

这是我的代码:

def read_data_file(datafile, token):

    dataset = []
    with open(datafile, 'r') as file:
        for line in file:
            #split each word by token
            data = line[:-1].split(token)
            tmp = []
            for x in data:
                if x != "":
                    x = float(x)
                    tmp.append(x)
                else:
                    tmp.append(1e+99)
            dataset.append(tmp)
    return dataset

程序在行处遇到错误:x = float(x)

4 个答案:

答案 0 :(得分:0)

您尚未提供完整的代码和数据文件来完全重现您的问题。但是可以从错误消息中猜出你的问题。

您的line[:-1].split(token)未能将line分解为单个数字字符串。你选择了一个不正确的分隔符(token是一个糟糕的名称选择),或者/并且省略了line中的最后一个字符。

试试这个(也减少许多不必要的行)

def read_data_file(datafile):
    dataset = []
    for line in open(datafile, 'r'):  
    # no need to assign open() to file, it will be closed when for is done
        dataset.append( [ float(token) for token in line.split() ] )
        # default (separator=None) works for most situations

        dataset.append(1e+99)
        # do you really need to append a fake number?
        # a better way might be a list of lists
    return dataset

答案 1 :(得分:0)

这假设您的文件中的数据在一行上,如下所示:

-4.4987000e-01 -2.0049000e-01 -4.8729000e-01 -6.1085000e-02 -5.1024000e-02 -2.1653000e-02

我做了一些调整并运行了如下代码并且它有效。它可能不是你想要的,但如果是这样,那么你需要更具体地了解你想要什么。如果您文件中的数据与上述内容不同,那么您还需要向我们展示它在文件中的确切位置。

def read_data_file(datafile, token):
    dataset = []
    with open(datafile, 'r') as file:
        for line in file:
            #split each word by token
            data = line[:-1].split(token)
            tmp = []
            for x in data:
                if x != "":
                    x = float(x)
                    tmp.append(x)
                else:
                    tmp.append(1e+99)
            dataset.append(tmp)
    return dataset

dataset = read_data_file('test_data.txt',  ' ')
print(dataset)
# output
'''
[[-0.44987, -0.20049, -0.48729, -0.061085, -0.051024, -0.021653]]
'''

如上所述,使用token作为参数不是一个好选择,但它会起作用。如果您的数据总是以空格分隔并且在一条线上,那么请使用“令牌”#39;并执行此操作:data = line[:-1].split(' ')

答案 2 :(得分:0)

使用str.strip删除任何尾随空格。并按所需的标记拆分。您可以使用map在列表中的每个元素上应用浮点数。

<强>实施例

def read_data_file(datafile, token):
    dataset = []
    with open(datafile, 'r') as file:
        for line in file:
            #split each word by token
            dataset.append(map(float, map(float, line.strip().split(token))))
    return dataset

答案 3 :(得分:-1)

在调用float之前,需要提供一个检查,以确保没有其他数据会导致float函数导致错误。通常它是字符\ x00。你需要打电话给

filtered_value = x.replace("\x00", "")
filtered_value = float(filtered_value)
tmp.append(filtered_value)