此代码的目标是标题,但仅查找以“发件人”开头的电子邮件。需要注意的是,我的教授要求我使用三个变量。我们正在使用的{.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(从何而来)?我相信问题在于计数器没有粘住,因此如何在计数时跟踪计数器?
答案 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
不会被检查或他们的计数器增加。