2016-08-13 61 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

非常感謝! –