2016-01-03 47 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

好点。添加。 –