错误:无法将字符串转换为浮点数

时间:2015-04-28 18:30:39

标签: python type-conversion

这是我的代码。我想从“data.txt”读取数据并将其转换为PAYPAL_TEST = True 类型,但转换数据时出现问题。错误说“无法将字符串转换为浮点数:”。

float

该文件包含以逗号分隔的数字。

3 个答案:

答案 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)正在窒息的确切值。