2016-08-13 66 views
-1

编写一个文件名提示的程序,然后打开文件,并 通过读取该文件,寻找格式的行:计数线,浮点数在选择线路,增加他们并计算平均

X-DSPAM-Confidence: 0.8475

计数这些线和从每个 线提取浮点值并计算这些值的平均值,并产生一个输出 如下所示。请勿在解决方案中使用sum()函数或名为sum的变量 。

你可以当您在测试下面输入mbox-short.txt为文件名的 http://www.pythonlearn.com/code/mbox-short.txt
下载的样本数据。

这是我的代码,这是行不通的。如果你知道如何解决它,请解释(尽量简单):

# Use the file name mbox-short.txt as the file name 
fname = raw_input("Enter file name: ") 
fh = open(fname) 
count = 0 
total = 0 
for line in fh: 
    if not float(line.startswith("X-DSPAM-Confidence:")) : continue 
    count = count + 1 
    float(total) = float(total) + float(line) 
float(average = total/count) 
print "Average spam confidence: ", average 

正确答案应该是:Average spam confidence: 0.750718518519

+0

您需要先从该行的其余部分提取浮动字符串,然后再尝试对其进行转换或对其进行算术运算。 “行”仍然包含整个行。 – mpez0

+1

您要做的第一件事就是从代码中删除语法错误。在尝试解决逻辑问题之前这样做。在这里问你的问题之前,你应该做到这一点:尽可能多地做到这一点。你会更好地学习这种方式。 –

回答

1

你不能在你的代码做任何实际提取的浮点值该线。简单地将line作为一个浮点数并试图将其添加到total将无法正常工作,因为line指的是文件中的整行。提取浮点数值的简单方法是将行分割为:,然后将所有内容都放在后面。这可以这样做:floatnum = line.split(':')[1][1]意味着它将采用我们用来分割线的分隔符之后的所有内容,在本例中为:

您的代码中存在其他一些错误,因此如果您只想提取浮点数并将其应用于您正在使用的方法并相应地调整您的代码,那将是一个好主意。

下面是你工作的例子,虽然会得到完成你所需要的:

fname = raw_input('Enter file name: ') 
file = open(fname) 

counter = 0 
total = 0.0 

for line in file: 
    if 'X-DSPAM-Confidence:' in line: # checks to see if line pertains to you 
     counter += 1      # if so, increment counter 
     floatnum = line.split(':')[1] # splits line at ':' and takes everything after it 
     total += float(floatnum)   # ... and adjust total 

average = total/counter     # gets average 

print 'Average spam confidence: ' + str(average) 

我使用这个文件作为输入,其中包含:

hello world 
X-DSPAM-Confidence: 0.8475 
hello world 
X-DSPAM-Confidence: 0.8400 
hello world 
X-DSPAM-Confidence: 0.9475 
hello world 

结果: Average spam confidence: 0.878333333333

+0

行'floatnum.lstrip()。strip('\ n')'什么都不做,但它不会影响你的代码,因为'float'忽略了前导和尾随的空白。 – DSM

+0

@DSM你完全正确,我的坏。删除它。 – Harrison

+0

非常感谢! –