【问题标题】:How do I rename a file programmatically when it is downloaded automatically in Python-Selenium?在 Python-Selenium 中自动下载文件时,如何以编程方式重命名文件?
【发布时间】:2020-05-01 08:35:26
【问题描述】:

我有一个 Selenium(Chrome) 脚本,它转到一个 URL 并按顺序下载一堆文件。但是这些名称都是乱码,因此 Selenium 和 Chrome 都无法控制下载文件的名称。所以我想要做的是观察下载目录中创建的任何新文件,然后在创建时用我自己选择的名称重命名它们。

我该怎么做?我听说watchdog 是一个很好的包来创建和记录一个EventListener。但是,当on_created 事件被触发时,如何动态地向处理程序传递一个特定的名称? 看门狗是正确的方法还是有其他可行的解决方案?

注意:我确实尝试使用 glob 获取目录中的所有内容,然后通过比较 创建时间 来更新最新文件的名称,但这会导致逻辑错误,因为它会混淆文件名,以防在执行此方法时尚未下载新文件。我已经为这个方法附上了下面的代码。

def __rename_downloaded_file(self, filename: str):
    """Rename the latest download file to the given name"""
    # TODO create a listener instead of the while loop
    while True:
        # keep looping in case there are no file in directory.
        list_of_files = glob.glob(f"{self.download_path}\\*.pdf")
        if len(list_of_files) > 0:
            break
    latest_file = max(list_of_files, key=os.path.getctime)
    print(latest_file)
    head, _ = os.path.split(latest_file)
    new_filename = os.path.join(head, filename+'.pdf')
    print(new_filename)
    os.rename(latest_file, new_filename)

【问题讨论】:

  • 您是如何下载文件的?考虑使用 wget,它具有命名输出文件的选项。
  • @agastya 我通过单击 selenium 脚本中的按钮自动下载文件。我没有使用wget的选项。
  • 能分享一下运行selenium和下载文件的代码吗?
  • @agastya 我不能。它会泄露我正在抓取的网站,它是专有的。但我可以告诉你,这一切都是通过点击按钮来实现的。所以self.driver.get_element_by_xpath(XPATH).click()。出现一个进度条(准备导出文件),我等待完成,然后单击下载链接,PDF 在下载部分弹出。
  • 当你到达最后一步(出现下载链接)时,使用 selenium 获取链接的路径(它将是一个 [href] 链接)。然后使用 wget 。它应该可以工作,您将能够重命名下载。

标签: python-3.x selenium-webdriver listener file-rename python-watchdog


【解决方案1】:

您是否尝试过等待文件下载。如果你这样做,你可以通过 max(list_of_files, key=os.path.getctime) 获取最新文件并更改最新文件名。文件更改后,您可以开始下载其他文件

【讨论】:

  • 我可以等,但要等多久?取决于互联网连接的速度和稳定性,是的,我将来会在服务器上托管它,所以我会有一个稳定的网络,但在那之前我该怎么办?有些文件很大,而有些文件很小。所以不能有硬编码的等待时间。
  • 谢谢。这可能会奏效。我会试一试,然后告诉你。
【解决方案2】:

答案是here

@Raghavendra Phayde 谢谢你让我参与这个话题。

您获得的下载列表按最新下载时间戳排序。然后,您可以使用以下代码重命名每个文件。

for old_filename, new_filename in zip(downloaded_file_names, rename_list):
    head, _ = os.path.split(old_filename)
    new_file_name_path = os.path.join(head, new_filename + '.pdf')
    # print(old_filename)
    # print(new_file_name_path)
    # print('\n')
    os.rename(old_filename, new_file_name_path)

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 2017-02-10
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2015-09-18
    • 2013-03-17
    • 1970-01-01
    • 2012-01-10
    相关资源
    最近更新 更多