2016-01-03 44 views
1

我正在處理一個小的代碼分配,偶然發現了一些我不明白的東西。所以我希望有人能幫助我並給我一個解釋。Python代碼讀取文件和提取數據

因此,我正在編寫一個代碼來編寫一個提示輸入文件名的程序。該文件可以在這裏找到:http://www.pythonlearn.com/code/mbox-short.txt。使用該文件,我通過它閱讀和查找格式的行:

X-DSPAM-Confidence: 0.8475. 

我的工作就是計算這些線,並從每一行提取浮點值,並計算這些值的平均值。

我有下面的代碼至今:

#fname = File Path 
fh = open(fname) 
emptyl=[] 
for line in fh: 

    if not line.startswith("X-DSPAM-Confidence:"): continue 
    line=line.strip() 
    print line 

    for confidence in line: 
     try: 
      x = float(line[-6:]) 
      print x 
      y = emptyl.append(x) 
      print y 
     except: 
      pass 

當我打印線,我得到27行與X-DSPAM-Confidence:"。但是,當我打印x來查看我的代碼的結果時,我得到的每一個數字在打印行中出現了26次。爲什麼數字重複?另外,當我打印y,我得到None。我也不明白爲什麼它給我None而不是實際的數字。

回答

0

擺脫這種額外的循環for confidence in line:的:

emptyl=[] 
with open(fname) as fh: 
    for line in fh: 
     if not line.startswith("X-DSPAM-Confidence:"): 
      continue 
     line = line.strip() 
     try: 
      x = float(line[-6:]) 
      emptyl.append(x) 
     except Value Error: 
      pass 

你有兩個嵌套循環。通過所有行首先你循環:

for line in fh: 

和每行您遍歷所有的字符在這一行:

for confidence in line: 

和追加這個數字:一次又一次float(line[-6:])

append()是一種修改其所屬對象的方法。所以:

emptyl.append(x) 

修改emptyl。此操作的返回值是None。通常,它不被使用,因爲我們正在修改emptyl

+0

爲什麼不使用with語句。它也會清理文件資源。 –

+0

好點。添加。 –