【问题标题】:Why does the following python code not work? [closed]为什么以下 python 代码不起作用? [关闭]
【发布时间】:2021-08-27 13:56:51
【问题描述】:

我对 python 很陌生,我已经在这方面工作了一段时间。我使用了while循环并且它有效,但是我再次尝试它并且由于某种原因它似乎不起作用。代码循环,但即使达到 CSV 文件中的时间也没有任何反应。该代码在不使用循环时也可以工作,并且只是在 CSV 文件中运行它。

import time
from datetime import datetime
import calendar
import webbrowser
import csv

#Open CSV file
with open("/Users/3021118/Applications/URL-Opener/timings.csv", "rt") as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for lines in csv_reader:
        
        while True:
            #Declares 'now' as the current time
            now = datetime.now().strftime("%H:%M")
            
            #Opens up URL
            if lines[0] == now:
                meetinglink = lines[1]
                webbrowser.open(meetinglink)
                time.sleep(60)
                print('MEETING JOINED!')

这是 timings.csv 的样子

【问题讨论】:

  • while True: 是一个无限循环。您的代码将从csv_reader 读取first 行,然后永远卡在while True: 循环中
  • 我建议添加更多print() 语句以了解这段代码在做什么。

标签: python python-3.x list loops csv


【解决方案1】:

您是否可能将顺序与“while True”循环和 for 循环混淆了? 您的代码将查看第一行(即标题),然后继续检查 Timings==now。

尝试在打开的 CSV 文件之外使用 while true 循环,如下所示:

import time
from datetime import datetime
import calendar
import webbrowser
import csv

while True:

    #Open CSV file
    with open("/Users/3021118/Applications/URL-Opener/timings.csv", "rt") as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        for lines in csv_reader:
        
            #Declares 'now' as the current time
            now = datetime.now().strftime("%H:%M")
            
            #Opens up URL
            if lines[0] == now:
                meetinglink = lines[1]
                webbrowser.open(meetinglink)
                time.sleep(60)
                print('MEETING JOINED!')

您可能想查看 break() 的条件,以便您的代码不会无限期地运行。

【讨论】:

  • Pranav Hosangadi 完美解释!
【解决方案2】:

第一个问题是您的第一行是标题行,因此lines[0] 将是"timings" 并且永远不会等于格式化为字符串的时间,因此您应该在打开csv_reader 后立即跳过该行所以:

    csv_reader = csv.reader(csv_file, delimiter=',')
    next(csv_reader)

您的代码不会向前移动,因为就像其他人提到的那样,它永远保留在第一个链接的 while True 循环中。当您加入会议时,您可能忘记将break 退出该循环,以便外部for lines in csv_reader 循环可以进入下一次迭代。你也想在时间不对的时候睡一分钟,这样你就可以进入下一分钟了。

         while True:
            #Declares 'now' as the current time
            now = datetime.now().strftime("%H:%M")
            
            #Opens up URL
            if lines[0] == now:
                meetinglink = lines[1]
                webbrowser.open(meetinglink)
                print('MEETING JOINED!')
                time.sleep(60)
                break; ### <<---- Break out of while True after joining meeting

            time.sleep(60)  ### <<---- sleep even when you didn't start the meetibng

但是,这不是做你想做的事的好方法,因为这意味着如果你在第一次会议时间之后开始运行你的脚本,你需要等待几乎一整天,直到时间等于第一次见面的时间。您想查找当前时间的会议链接。这种情况非常适合使用字典。

首先,我们读取 csv 文件的所有行并创建一个查找字典

zoom_links = dict()
with open("/Users/3021118/Applications/URL-Opener/timings.csv", "rt") as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    next(csv_reader)
    for line in csv_reader:
        zoom_links[line[0]] = line[1]

现在zoom_links 看起来像这样:

{
 '07:50': 'https://zoom.link1',
 '08:30': 'https://zoom.link2',
 '09:30': 'https://zoom.link3'
}

接下来,我们可以有一个单独的 while True 循环,在正确的时间打开正确的链接:

while True:
    now = datetime.now().strftime("%H:%M")
    meetinglink = zoom_links.get(now, None) # Get the item at zoom_links[now], or None if no link for the current time

    if meetinglink is not None:
        webbrowser.open(meetinglink)
        print(f"Meeting {meetinglink} joined!")
    
    time.sleep(60) 
        

注意:我不想将您的图像转录成文本,所以我制作了这个虚拟 csv 文件。您应该发布您的输入文件 as formatted text 而不是图像,以便人们可以轻松地将您的输入复制到他们的环境中,以确保他们的代码给出预期的结果。

timings,meetinglink
07:50,https://zoom.link1
08:30,https://zoom.link2
09:30,https://zoom.link3

【讨论】:

    【解决方案3】:

    你应该删除

    while True:
    

    从您的代码中,或者您应该使用 break 来终止内部while 循环。 所以控制将到达for 循环。在if 中可以使用break

    【讨论】:

      【解决方案4】:

      当您读取带有标题的 CSV 文件时,它会卡在循环中。因为时间和 meetingUrl 不是匹配时间,例如 14:50。读取没有标题的文件。因此,对于 header=None,pd 或 df 库可能会更好。

      【讨论】:

      • 我不认为是这种情况,因为我已经将它设置为正好匹配时间,所以它会读取它并忽略它。
      • 看到 CSV 文件有标题并认为它被卡住了。这将是另一个错误。如前所述,状态丢失,无法进入 while 循环。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      相关资源
      最近更新 更多