Python ValueError: float: 参数: .不是第 12 行的数字

问题描述 投票:0回答:5

好吧,我是 python 新手,目前正在学习 python for every 课程 (py4e)。

我们第 7.2 课的作业是执行以下操作:

7.2 编写一个程序,提示输入文件名,然后打开该文件并读取该文件,查找以下形式的行:

X-DSPAM-Confidence:    0.8475

计算这些行并从每行中提取浮点值,计算这些值的平均值并产生如下所示的输出。不要在解决方案中使用 sum() 函数或名为 sum 的变量。 您可以在 http://www.py4e.com/code3/mbox-short.txt 下载示例数据,测试时输入 mbox-short.txt 作为文件名。

我想不通。我不断收到此错误

ValueError: float: Argument: . is not number on line 12

当我运行此代码时(参见屏幕截图):https://gyazo.com/a61768894299970692155c819509db54

num = float(balue) + float(num)
的 12 号线一直在运行。当我从 balue 中取出浮子时,我会得到另一个,上面写着

“类型错误:无法在第 12 行连接‘str’和‘float’对象”。

参数可以转换为浮点数还是只是一个字符串?这可能是问题所在,但我不知道这是否属实,即使是,我也不知道之后如何修复我的代码。

python python-3.x
5个回答
1
投票

我想说你的方法还不错。但是,我不明白您对

for balue in linez
的意图,因为这是迭代 linez 中包含的字符。你更想要的浮动(linez)。我想出了一个类似这样的解决方案:

fname = raw_input("Enter file name: ")
print(fname)

count = 0
num = 0
with open(fname, "r") as ins:
    for line in ins:
        line = line.rstrip()
        if line.startswith("X-DSPAM-Confidence:"):
            num += float(line[20:])
            count += 1

print(num/count)

这只是为了让您走上正确的轨道,我尚未验证答案或脚本的正确性,因为这应该包含您的作业。


1
投票

问题的简短答案是修复字符串切片以提取数字。

如果要查找冒号字符,“:”查找浮点数, 请记住,您必须对字符串进行切片,并在切片中添加 +1。如果你不这样做,你最终会得到----->:0.8475 这不是一个数字。 因此,对字符串进行切片,并在字符串的起始索引上添加 +1,这样您就可以解决问题了。


0
投票

我意识到这个问题已经得到解答 - 我正在做同样的课程,并且在那个确切的问题上我有相同的错误消息。这是由于该行被读取为非浮点造成的,我必须将其读取为

number =float((line[19:26]))

顺便说一句,课程中的Python环境对字符串中的空格非常敏感 - 我刚刚得到了正确的代码,但它拒绝了它,因为我有“:”,而正确的答案是“:” - 只花了半个小时冒号。

只是为了这个目的,这是我得出的答案,它已被接受为正确的答案。希望你最终能到达那里。

# Use the file name mbox-short.txt as the file name

count = 0
average = 0

filename = input("Enter file name: ")
filehandle = open(filename)

for line in filehandle:
    if not line.startswith("X-DSPAM-Confidence:") : continue

    line = line.rstrip()
    number =float((line[19:26]))

    count = count + 1
    average = average + number

average = (average / count)
average = float(average)
print("Average spam confidence:",average)

0
投票
#Take input from user
fname = input("Please inser file name:")


#try and except
try:
    fhand = open(fname)
except:
    print("File can not be found", fname)
    quit()

    
#count and total

count= 0
total = 0

for line in fhand:
    line = line.rstrip()
    if not line.startswith("X-DSPAM-Confidence:"):
        continue

    else:
        line = line[20:]
        uline = line.upper()
        fline = float(uline)

        count = count+1
        total = total + fline
        avr = total / count

print("Average spam confidence:" ,avr )

0
投票

@Vidyadhar 是对的!

您正在从行中切片

:    0.8475
,当解析器看到该列字符时会抛出异常。正如@Vidyadhar所说:“要找到浮点数,请记住你必须在切片中添加+1来对字符串进行切片”。 Soy 它在列字符之后进行切片,解析器可以将其转换为浮点数。

© www.soinside.com 2019 - 2024. All rights reserved.