在.txt文件中查找和计数电子邮件

时间:2019-02-04 21:39:14

标签: python-3.x parsing

此代码的目标是标题,但仅查找以“发件人”开头的电子邮件。需要注意的是,我的教授要求我使用三个变量。我们正在使用的{.3} .txt文件。我的代码:

Value     Square Root
  9          3.1250
Value     Square Root
  9          3.0025
Value     Square Root
  9          3.0000

输入和输出:

import time

try:
     fh = open('mbox.txt')
except IOError:
     print('Yo, we aint find mbox.txt')
     print("The program will now self-destruct")
     time.sleep(10)
     quit()


email1 = input('First email: ')
email2 = input('Second email: ')
email3 = input('Third email: ')
counter1 = 0
counter2 = 0
counter3 = 0
for line in fh:
     nline = line.rstrip()
     if not line.startswith('From '): continue
     if line.find(email1):
         counter1 += 1
     elif line.find(email2):
         counter2 += 1
     elif line.find(email3):
         counter3 += 1
print('\nFirst email:', email1, '=', counter1)
print('Second email:', email2, '=', counter2)
print('Third email:', email3, '=', counter3)

我的问题是;为什么第一封电子邮件总是打印相同的数字1797(从何而来)?我相信问题在于计数器没有粘住,因此如何在计数时跟踪计数器?

1 个答案:

答案 0 :(得分:0)

TLDR; 1797的值来自以From开头的所有行的计数。

许多可能的解决方案,但最简单的方法是使用str.count(substring)

for line in fh:
    nline = line.rstrip()
    counter1 += line.count(email1)
    counter2 += line.count(email2)
    counter3 += line.count(email3)

print('\nFirst email:', email1, '=', counter1)
print('Second email:', email2, '=', counter2)
print('Third email:', email3, '=', counter3)

输出:

First email: gjthomas@iupui.edu = 184
Second email: lance@indiana.edu = 33
Third email: nuno@ufp.pt = 114


说明:1797值从哪里来?

line.find('gjthomas@iupui.edu')返回找到的字符串的位置(字符串索引),如果找不到该字符串,则返回-1。因此,如果找不到-1,它将始终返回'gjthomas@iupui.edu';如果找到 ,则返回5

'From gjthomas@iupui.edu Tue Oct 23 09:23:04 2007\n'
0^^^^^^
1_|||||
2__||||
3___|||
4____||
5_____| starting index of the string is found 

现在最棘手的部分是python的Truth Value Testing状态:

  

默认情况下,除非对象的类定义了与该对象一起调用的返回__bool__()或返回False的__len__()方法,否则该对象被视为true。

因此,对于每行 From开头的行,则将评估下一行:

if line.find(email1): # both cases if `-1` if `5` evaluate to Truthy value
    counter1 += 1

因此,基本上任何以From 开头的行都会递增第一个计数器counter1,因此后续的elif不会被检查或他们的计数器增加。