2014-07-18 66 views
0

我想在python中編寫一個程序,該程序打開該文件並通過該文件讀取,查找某種模式。之後,我必須解析已識別的行並從每行中提取浮點值,然後計算所有行的平均值。這是我到目前爲止寫如何計算在python中包含浮點值的行的平均值

fname = raw_input("Enter file name: ") 
fh = open(fname) 
count = 0 
sum = 0 
for line in fh: 
    line = line.rstrip() 
    if line.startswith("X-DSPAM-Confidence:"): 
     count = count + 1 
     number = float(line[19:]) 
     for num in range(number): 
      sum = sum + num 
     average = sum/count 
print "Average spam confidence:", average 
print "Done" 

但我得到這個錯誤start must be a integer on line 12和我似乎無法理解爲什麼。我相對較新的python,我想知道如果我得到一些關於這個錯誤的幫助。

+1

'range'預計一個整數參數從0計數高達你給它一個浮點值。你是否需要對數字進行總和,並將它們平均到'fh'循環中的'for line'之後? –

+0

是的,但我需要首先解析這些行來提取數字,然後計算,求和並最終得到它們的平均值。如果我不給範圍,那麼我得到另一個錯誤'浮動值不能迭代'。 – upendra

回答

2

你不需要循環該行,是嗎?我假設你的數據如下所示:PATTERN:FLOAT如果是這種情況,試試這個。

fname = raw_input("Enter file name: ") 
fh = open(fname) 
count = 0 
sum = 0 
for line in fh: 
    line = line.rstrip() 
    if line.startswith("X-DSPAM-Confidence:"): 
     count = count + 1 
     number = float(line[19:]) 
     #for num in range(number): 
     sum = sum + number 
     average = sum/count 
print "Average spam confidence:", average 
print "Done" 

如果你對另一方面的數據是這樣的圖案:浮動SOMESEPERATOR浮動...

,那麼你應該將它們分開之前他們分開。

fname = raw_input("Enter file name: ") 
fh = open(fname) 
count = 0 
sum = 0 
for line in fh: 
    line = line.rstrip() 
    if line.startswith("X-DSPAM-Confidence:"): 
     numbers = line[19:].split("SPERATOR") 
     for num in numbers: 
      count = count + 1 
      sum = sum + num 
     average = sum/count 
print "Average spam confidence:", average 
print "Done" 

LG

+0

我的模式看起來像以前的'X-DSPAM-Confidence:0.8475'。然而,當我嘗試你的解決方案,該模式我得到這個錯誤:名稱'num'沒有在第12行定義' – upendra

+0

sry,不是num ...忘了改變它,應該是數字 –

+0

它的工作。我應該由我自己記下。但無論如何,感謝您的幫助。非常感激。 – upendra

1

如果你只是想從1找到連續數字的總和n您可以使用身份

sum = (n*(n+1))/2 

然後,如果你需要的這個平均您有效地用n分而只剩下身份

avg = (n+1)/2.0 

但是,如果你的價值n是一個浮動,那麼它似乎不太可能你想數到浮動。如果你有一個浮動列表,那麼你可以通過簡單地總結列表來找到平均值:

sum = 0 
for n in my_list: 
    sum += n 
avg = sum/ len(my_list) 
+0

也許在最後一種情況下使用'sum = 0.0'來清晰和安全地檢查。 – eatonphil

1

您不必遍歷所有的浮點值,你只需要總結不同的浮點值,計算平均值。

這是一個帶可迭代計數的溶液:

class CountingIterable(object): 
    def __init__(self, iterable): 
     self.iterable = iter(iterable) 
     self.count = 0 

    def __iter__(self): 
     for item in self.iterable: 
      yield item 
      self.count += 1 

    def __int__(self): 
     return self.count 

with open(fname) as fh: 
    values = CountingIterable(
     float(line.split(':')[1]) 
     for line in fh 
     if line.startswith("X-DSPAM-Confidence:")) 
    average = sum(values)/int(values) 

print "Average spam confidence:", average 
print "Done"