Найти и посчитать электронные письма в текстовом файле - PullRequest
0 голосов
/ 05 февраля 2019

Цель этого кода в названии, но найти только те электронные письма, которые начинаются с «От».Что-то, на что нужно обратить внимание, мой профессор потребовал от меня использования трех переменных.Файл .txt, который мы используем mbox.txt Мой код:

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)

Вход и выход:

In [1];First email: gjthomas@iupui.edu

   ...;Second email: lance@indiana.edu

   ...;Third email: nuno@ufp.pt

Output: First email: gjthomas@iupui.edu = 1797
Output: Second email: lance@indiana.edu = 0
Output: Third email: nuno@ufp.pt = 0

Итак, мои вопросы;Почему в первом электронном письме всегда указывается один и тот же номер 1797 (откуда он)?Я считаю, что проблема в том, что счетчики не залипают, так как я могу отслеживать счетчики во время их подсчета?

1 Ответ

0 голосов
/ 05 февраля 2019

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 

Теперь сложная часть этого питона Проверка значения истины состояния:

По умолчанию объект считается истинным, если в его классе не определен либо метод __bool__(), который возвращает False, либо метод __len__(), который возвращает ноль,при вызове с объектом.

Так что для каждой строки, которую делает , начинается с From, тогда следующая строка оценивается:

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

такпрактически любая строка, которая начинается с From , будет увеличивать первый счетчик counter1, и, следовательно, последующие elif не проверяются, а их счетчики не увеличиваются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...