我的 Python 等待文件出现在目录中的脚本在验证此存在的级别上迭代过多

My Python script that waits for a file to be present in a directory iterates too much at the level of the verification of this presence

我创建了一个 Python 脚本,它需要一个文件出现在一个目录中。例如,该文件是从浏览器(例如使用 Selenium)下载的。我想象的工作流程如下:

  1. 想象一个可以在所需目录中创建文件的操作(例如,在 Windows/Linux 的默认下载目录中使用 Selenium 下载)
  2. 最多10次,尝试执行此动作并等待10秒
  3. 每次,在这 10 秒后,检查文件是否存在于目录中:如果存在,则中断循环并继续执行脚本,因为现在它有想要的文件。如果否,继续循环直到完成 10 次(或更少)。
  4. 当 10 次完成后目录中仍然没有文件时,引发致命错误

我的问题

即使文件存在于目录中,循环也会执行 10 次而不是中断。

脚本(最小且可执行的示例)

来源

    file_was_downloaded = False
    for u in range(10):
        click(Link('download the file in the directory'))
        time.sleep(10)
        files = os.listdir('C:/Users/XYZ/Downloads/')
        for f in files:
            if f.startswith("the_file.jpg") and not f.endswith(".crdownload"):  # ".crdownload" if a suffix appended to the name of the file by Google Chromium/Chrome if it's not completely downloaded
                file_was_downloaded = True
                break
    if not file_was_downloaded:
       print(datetime.datetime.now() + " - The file may not be present in the directory.\n")
       exit(-1)
    
    # Below this line, we can use the file.

测试

你可以删除click行,然后在你需要的时候在目录中添加你想要的文件来替换它,而脚本是运行。你会看到即使文件在目录中,循环也会继续迭代。这就是问题所在,我不知道为什么会这样。

预期行为

当文件在目录中被检测为“存在”时,循环中断。

实际行为

循环继续迭代。

您的 break 语句仅中断“for f in files”循环。 在“for u in range”循环中添加另一个 if:

if file_was_downloaded:
   break
  

尝试这样的事情:

import time

for i in range(10):
    '''your donwload code'''
    try:
        file = open("yourfile.jpg")
        break
    except:
        time.sleep(10)