2016-01-09 134 views
0

7.2编写的文件名称提示中的程序,然后打开文件,并通过文件读取,寻找形式的行:任何人都可以帮我解释这个python代码吗?

X-DSPAM-Confidence: 0.8475 

计数这些线,并且从每个提取浮点值并计算这些值的平均值并产生如下所示的输出。

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

这就是我所做的,并得到了输出,但它是做到这一点?:

fname = raw_input("Enter file name: ") 
fh = open(fname) 
sum = 0 
count = 0 
for line in fh: 
if not line.startswith("X-DSPAM-Confidence:") : continue 
    line = line.replace("X-DSPAM-Confidence:","") 
    line = line.strip() 
    sum = sum + float(line) 
    count = count + 1 

avg = sum/count 

print "Average spam confidence:",float(avg) 

然而,在其他一些双方以正确的方式,这其中,和GitHub上的代码已被写入不同。任何人都可以解释给我吗?

1)

fname = raw_input("Enter file name: ") 
fh = open(fname) 
tot = 0.0 
count = 0 
for line in fh: 
    if not line.startswith("X-DSPAM-Confidence:") : continue 
    words = line.split() 
    tot = tot + float(words[1]) 
    count = count + 1 
print "Average spam confidence:", tot/count 

是什么split()在这里做?删除空白处并将其打印在下一行右侧?那么这有什么帮助?那么float(words[1])会是什么?对不起,这听起来很愚蠢,但这是我进入Python的第三天,我只是想学习。

2)很多人都使用合计这样:

a = line.split(':') 
    sum = sum + float(a[1]) 

这是如何工作的?

+0

不要将其命名变量'sum';它会隐藏内置的“总和”(对于像这样的许多任务来说这通常很方便);隐藏内置是一个可怕的想法。 – ShadowRanger

回答

1

split将使用空格或任何您传递的字符作为参数将单个字符串拆分为多个列表。通过采取[1]你使用生成的字符串的第二,因为指数为0。

float开始会忽略前导空格,所以如果你劈在:和人们留下了一些空间也没关系。

+0

所以你说的是,如果我们使用split(),每个都是单个字符串?因此,程序中的词[1]不应该是“ - ”,因为它是第二个? –

+0

或者你说的是,如果我们使用split(),它将删除X-DS和数字之间的空格。空间的左侧变成了[0],右变成了[1]?如果还有另外一个空间,并且一个字符在数字后面说'香蕉',香蕉就会是[2]? –

+0

@JaneDoe“空白处”我的意思是任何空格字符或等价物(比如制表符或换行符),然而其中有很多。 '-'不算作空格。是的,如果数字后面有空格,那么数字和下一个空格之间的任何内容都是'a [2]'。 –

0

在您的文件输入中,您总是有"X-DSPAM-Confidence" - XDSPAM-Confidence: 0.6959。因此,有空间,因为,你的line.split()分裂所需的一行:

['X-DSPAM-Confidence:', '0.9846'] 

由于默认情况下空间是分开命令参数。

+0

是的,我现在明白了。但是,当我们在之后使用“tot = tot + float(words [1])”时,仍然很难理解它的用法。删除空间如何帮助我们获取号码? –

+0

所以你说的是,如果我们使用split(),它将删除X-DS和数字之间的空格。空间的左侧变成了[0],右变成了[1]?如果还有另外一个空间,并且一个字符在数字后面说'香蕉',香蕉就会是[2]? –

+0

现在单词变量是一个列表(为简单起见,您可以假设它是数组),并且您的索引中包含您必须取平均值的索引。此外,提取的值是类型字符串,它是类型转换为浮点数。是的,你是正确的 –

1
  1. str.split()将字符串拆分为列表。查看文档中的示例以获取更多的信息。顺便说一句:

    >>> '1 2 3 4'.split() 
    ['1', '2', '3', '4'] 
    
    >>> '1:2:3:4'.split() 
    ['1:2:3:4'] 
    
    >>> '1:2:3:4'.split(':') 
    ['1', '2', '3', '4'] 
    
    
    >>> 'X-DSPAM-Confidence: 0.8475'.split() 
    ['X-DSPAM-Confidence:', '0.8475'] 
    
    >>> 'X-DSPAM-Confidence: 0.8475'.split(':') 
    ['X-DSPAM-Confidence', ' 0.8475'] 
    
  2. a[1]在这种情况下列表索引。如上面的例子:

    >>> a = 'X-DSPAM-Confidence: 0.8475'.split(':') 
    >>> a[0] 
    'X-DSPAM-Confidence' 
    >>> a[1] 
    ' 0.8475' 
    

    它是:

    ['X-DSPAM-Confidence', ' 0.8475'] 
         ^^^^    ^^^^ 
        a[0]    a[1] 
    
  3. float(x):返回从一个数字或字符串x构造的浮点数。

    这很容易理解:

    >>> float('0.8475') 
    0.8475 
    
    >>> a = 'X-DSPAM-Confidence: 0.8475'.split(':')  
    >>> float(a[1]) + 0.5 
    1.3475 
    
    >>> a[1] + 0.5 
    Traceback (most recent call last): 
        File "<input>", line 1, in <module> 
    TypeError: Can't convert 'float' object to str implicitly 
    

    如果你不这样做的转换,Python会引发Type当你的字符串对象之间运行+和漂浮的物体,像上面的例子。

    然而,float()忽略空格。所以:

    >>> float('   0.8475 ') 
    0.8475 
    
+0

我想我仍然不清楚split(),这就是为什么我不理解这里的几个位。所以你说的是,如果我们使用split(),它将删除X-DS和数字之间的空格。空间的左侧变成了[0],右变成了[1]?如果还有另外一个空间,并且一个字符在数字后面说'香蕉',香蕉就会是[2]? –

+0

@JaneDoe:好的,请检查我的答案中链接的文件。 ''str.split()'用** no'sep' **将字符串拆分成*空格,换行符('\ n'),制表符('\ t')等空字母*你在这种情况下设置'':''''sep'参数,它不会删除空格,而是通过'sep''分割字符串:'。所以它给出了'['X-DSPAM-Confidence','0.8475']'。而'a [1]'是''0.8475'。 –

相关问题