这是我的代码。我想从“data.txt”读取数据并将其转换为PAYPAL_TEST = True
类型,但转换数据时出现问题。错误说“无法将字符串转换为浮点数:”。
float
该文件包含以逗号分隔的数字。
答案 0 :(得分:0)
我可以重现这一点的唯一方法是在文件末尾加一个空行。所以我的数据文件如下所示:
12.34 , 56.78 , 90.12 , 34.56
之后有一个空白行,但我无法显示!所以这是另一种格式:
od -xc data.txt
0000000 3231 332e 2034 202c 3635 372e 2038 202c
1 2 . 3 4 , 5 6 . 7 8 ,
0000020 3039 312e 2032 202c 3433 352e 0a36 000a
9 0 . 1 2 , 3 4 . 5 6 \n \n
0000037
请注意文件末尾附近的\n\n
。
试试这段代码:
def CrearMatriz():
archi = open("data.txt", "r")
num = archi.readlines()
for line in num:
line=line.strip()
if line:
nums=[float(x) for x in line.split(",")]
return nums
Numero = CrearMatriz()
但是,如果您有多行数字,这不起作用!它只会返回最后一行数字。所以这可能会更好(取决于你需要的):
def CrearMatriz():
nums = []
for line in open("data.txt", "r"):
line=line.strip()
if line:
nums.extend([float(x) for x in line.split(",")])
return nums
Numero = CrearMatriz()
如果您需要列表列表,请将extend
更改为append
。
答案 1 :(得分:0)
我并不是说它是完美的答案,但我建议你在列表理解之外进行解析,并在成功时附加到nums,至少在你的格式化修复所有内容之前。
通过查看我得到的错误,一种可能性就是看起来line.strip()不会占用文件中的空白行。
def CrearMatriz():
archi = open("data.txt", "r")
num = archi.readlines()
for lines in num:
nums= [float(x) for x in lines.strip().split(",")]
return nums
def CrearMatriz2():
with open("data.txt", "r") as archi:
#having it in a separate function allows more robust formatting
#and error handling. append to nums on success
def tofloat(nums, x, lines, cntr):
try:
res = float(x)
assert isinstance(res, float)
nums.append(float(x))
except Exception, e:
msg = "exception %s on field:%s: for line #%s:%s:" % (e, x, cntr,lines)
print (msg)
return
nums = []
num = archi.readlines()
for cntr, lines in enumerate(num):
[tofloat(nums, x, lines, cntr) for x in lines.strip().split(",")]
return nums
data="""
0.12,30.2,30.5,22
3,abc,4
"""
with open("data.txt","w") as f_test:
f_test.write(data)
try:
print "\n\ncalling CrearMatriz"
Numero = CrearMatriz()
print "\nCrearMatriz()=>", Numero
except Exception, e:
print e
try:
print "\n\ncalling CrearMatriz2"
Numero = CrearMatriz2()
print "\nCrearMatriz2()=>", Numero
except Exception, e:
print e
这给了......
calling CrearMatriz
could not convert string to float:
calling CrearMatriz2
exception could not convert string to float: on field:: for line #0:
:
exception could not convert string to float: abc on field:abc: for line #2:3,abc,4
:
exception could not convert string to float: on field:: for line #3:
:
CrearMatriz2()=> [0.12, 30.2, 30.5, 22.0, 3.0, 4.0]
答案 2 :(得分:-1)
我对
的类型感兴趣lines.strip().split(",")
在我看来,strip()应该在一个字符串上工作,但是line会是一个字符串列表。您可能需要双重理解,例如:
[[float(x) for x in line.strip().split(",")] for line in lines]
如果没有您的数据,我无法验证这一点。
您可以尝试删除float(x)并使用
nums= [x for x in lines.strip().split(",")]
print(nums)
查看float(x)正在窒息的确切值。