【问题标题】:Comparing two strings in Python not showing the intended result在 Python 中比较两个字符串未显示预期结果
【发布时间】:2021-01-22 16:32:34
【问题描述】:

这是一个更复杂脚本的抽象。目标是从未读电子邮件中获取信息并将其添加到 CSV 文件中。 它还需要首先检查文件是否存在。为了简化,我放置了打印语句而不是函数调用。这仍然带来了问题。

import ezgmail
import csv

orderEmails = ezgmail.search('subject:Automatic message, label:UNREAD')
unreadThreads = ezgmail.unread()
amountMessages = len(orderEmails[0].messages)
number: int
for number in range(amountMessages):
    message = orderEmails[0].messages[number]
    date = message.timestamp
    try:
        with open('file.csv','r') as file:
            csvReader = csv.reader(file, delimiter=',')
                for row in csvReader:
                    if row[0] == date:
                        print("Timestamp already exists")
                    else:
                        print("Ok")
    except FileNotFoundError:
        print("No such file")

file.csv 的内容

Date,Name,City
2020-12-27 18:11:16,John,New York
2020-12-29 17:44:23,Mary,Berlin

变量“日期”应该是循环第一次运行时的这个字符串:

2020-12-27 18:11:16

然后这个:

2020-12-30 12:51:32

我期望得到的是:

Timestamp already exists
Ok

我得到的是:

Ok
Ok
Ok
Ok
Ok
Ok

除了显然不明白为什么会发生这种情况,我也不明白为什么会有 6 条“Ok”消息。

【问题讨论】:

  • for row in csvReader 之后添加print(date) 行,看看您是否可以识别您的问题。
  • 感谢您的建议。这就是我现在得到的,添加 next(csvReader) 2020-12-27 18:11:16 Ok 2020-12-27 18:11:16 Ok 2020-12-30 12:51:32 Ok 2020-12- 30 12:51:32 好的

标签: python string csv


【解决方案1】:

您正在迭代 csvReader,这也会为您提供标题行

# First row
['Date', 'Name', 'City']

# Second row
['2020-12-27 18:11:16', 'John', 'New York']

# Third row
['2020-12-29 17:44:23', 'Mary', 'Berlin']

字符串 'Date' 不等于字符串 '2020-12-27 18:11:16',因此执行 IF 的 print("Ok") 分支。


至于为什么要打印 6 "Ok" messages - 我猜你已经多次这样做了 - 因为变量 amountMessages 中存储的数字。

for number in range(amountMessages):
   ...

奖金 LPT(生活专业提示)?

如果不确定,通常最简单的做法是将交互式调试器放入其中 - 您可以在执行期间检查变量。

如果您有 Python <3.7,您可以简单地将 import pdb; pdb.set_trace() 放入您的代码中,如下所示:

...
    for row in csvReader:
        import pdb; pdb.set_trace()
        if row[0] == date
        ...
...

... 并运行您的代码。这样,您将获得交互式调试会话,您可以在其中执行...

(Pdb) yay = 123
(Pdb) yay
123
(Pdb) row[0]
'Date'

如果您有 Python >=3.7,则可以使用内置的 breakpoint() 函数,您可以使用它来代替。

更多关于 pdb 的信息请参阅 Python 官方文档:https://docs.python.org/3/library/pdb.html

【讨论】:

  • 感谢您的回答。我现在添加了 next(csvReader) 行并得到 4 个“Ok”而不是 6 个。猜猜这是一个进步。变量 amountMessages == 2
  • 4 "Ok"s 似乎是正确的。您正在迭代 two CSV lines 乘以 two messages
  • 谢谢!使用 Pdb 我发现时间戳的格式不同。但是,在打印时,它显示的格式与我之前公开的相同。要清楚: print(date) => 2020-12-27 18:11:16,而 (Pdb) date => datetime.datetime(2020, 12, 27, 18, 11, 16)
猜你喜欢
  • 2016-05-07
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多