我试图从文本文件中读取一个数字列表,当我运行代码时出现此错误:
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)
答案 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)