好吧,我是 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’对象”。
参数可以转换为浮点数还是只是一个字符串?这可能是问题所在,但我不知道这是否属实,即使是,我也不知道之后如何修复我的代码。
我想说你的方法还不错。但是,我不明白您对
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。如果你不这样做,你最终会得到----->:0.8475 这不是一个数字。 因此,对字符串进行切片,并在字符串的起始索引上添加 +1,这样您就可以解决问题了。
我意识到这个问题已经得到解答 - 我正在做同样的课程,并且在那个确切的问题上我有相同的错误消息。这是由于该行被读取为非浮点造成的,我必须将其读取为
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)
#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 )
@Vidyadhar 是对的!
您正在从行中切片
: 0.8475
,当解析器看到该列字符时会抛出异常。正如@Vidyadhar所说:“要找到浮点数,请记住你必须在切片中添加+1来对字符串进行切片”。 Soy 它在列字符之后进行切片,解析器可以将其转换为浮点数。