为什么这个基本的python程序不起作用?

时间:2015-06-02 15:46:22

标签: python email text organization

那么程序应该检查它是否看到" ok"在电子邮件旁边,如果它确实在另一个txt文件中吐出电子邮件。

输入txt文件:

.......ng0@gmail.com,ok
.......ad@live.com,fail
.......12@live.com,fail
.......5w@live.com,fail
.......np@gmail.com,ok
.......an@live.com,fail
.......40@excite.com,fail
.......g1@gmail.com,ok

python代码是:

readEmails = open("C:\\Users\\Greg\\Desktop\\rewriteEmails.txt","r")
writeEmails = open("C:\\Users\\Greg\\Desktop\\OutputEmails.txt","w")

for line in readEmails:
    subbed = line[-3:]
    if subbed == "ok":
        split = line.split(",")
        writeEmails.write(split[0])
        print("Email Added")
    else:
        print("Error")

该程序似乎总是转到if语句的else部分。我有点大脑放屁;我很乐意接受你的建议。

5 个答案:

答案 0 :(得分:5)

这一行:subbed = line[-3:]将为您提供line的最后3个字符,这些字符永远不会是'ok',即2个字符。

答案 1 :(得分:2)

您可以执行此操作line.strip().endswith('ok')

,而不是依赖于字符串长度(您有3而不是2)

答案 2 :(得分:1)

简单地说“ok”行的最后三个字符是“,ok”:

>>> line = ".......g1@gmail.com,ok"
>>> line[-3:]
',ok'

修改的 前面的行以新行结束,因此我们将包含换行符而不是逗号:

>>> line = """.......ng0@gmail.com,ok
... """
>>> line[-3:]
'ok\n'

编辑结束

也许你应该只比较最后两个字符:

for line in readEmails:
    subbed = line[-2:]
    #as you were

对于真正的错误案例,通常会报告错误,然后您可以轻松地告诉错误。而不只是说

else:
    print("Error")

您也可以打印出subbed变量,并且可能已经明显存在问题。

答案 3 :(得分:1)

你的问题就在这一行

subbed = line[-3:]

返回以下内容:

ok\n

il\n

因此,if语句检查subbed == 'ok'每次都会失败。

您可以通过剥离换行符后仅取最后两个字符来解决此问题:

subbed = line.strip()[-2:]

我的原始答案没有考虑从文件中读取。该答案假设结果为,okail。从文件读取时,这不是正确的响应。上面的答案已被修改,以显示将返回的内容并适当调整解决方案。

答案 4 :(得分:1)

您可以使用正则表达式解决问题。以下是您的代码示例。

import re

for line in readEmails:
    subbed = re.match("(?:.*),(\\w+)", line)
    print(subbed.group(1))
    if subbed.group(1) == "ok":
        writeEmails.write(subbed.group(1))
        print("Email Added")
    else:
        print("Error")