【问题标题】:Why is this basic python program not working?为什么这个基本的 python 程序不起作用?
【发布时间】:2015-08-16 12:26:23
【问题描述】:

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

【问题讨论】:

  • 你做过基本的调试吗?如果它似乎一直在达到 else 条件,则意味着 subbed 不是 == 到“ok”,那么 line[-3:] 返回的是什么?
  • 行尾也包含换行符。
  • 如果有办法剥离那些...
  • 如果这是一个实际的 csv 文件,请考虑使用 csv module,它会处理换行符并为您拆分字段。

标签: python email text organization


【解决方案1】:

你的问题是这一行

subbed = line[-3:]

这将返回以下内容:

ok\n

il\n

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

您可以在去掉换行符后只取最后两个字符来解决这个问题:

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

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

【讨论】:

  • line[-3:] 实际上会返回 "ok\n"'il\n' 除了最后一行。
  • 对于最后一行,这可能仍然会失败,最好先剥离,然后取 2 片。
  • 你是对的@AshwiniChaudhary。我已经调整了strip() 出现的位置。
【解决方案2】:

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

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

【讨论】:

  • @AshwiniChaudhary 使用正则表达式会更好。另外,将来很容易将结尾从“ok”更改为其他内容
  • 正则表达式对于这种琐碎的情况是不必要的,我会选择:line.rstrip().endswith("ok")
【解决方案3】:

简单地说,“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 变量,问题出在哪里可能已经很明显了。

【解决方案4】:

您可以这样做line.strip().endswith('ok')

,而不是取决于字符串长度(您有 3 个而不是 2 个)

【讨论】:

  • 这使得代码的意图更加清晰。好建议。
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 2022-01-17
    • 1970-01-01
    • 2013-01-26
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2013-04-28
    相关资源
    最近更新 更多