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

Why is this basic python program not working?

好吧,程序应该检查它是否在电子邮件旁边看到 "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 部分。我有点脑子放屁了;我会喜欢你的建议。

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

只是 "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 变量,问题所在可能已经很明显了。

你的问题是这一行

subbed = line[-3:]

这个returns以下:

ok\n

il\n

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

您可以通过在去除换行符后只取最后两个字符来解决此问题:

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

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

而不是依赖于字符串长度(你有 3 而不是 2),你可以这样做 line.strip().endswith('ok')

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

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")