如何用Python检查文件保存是否完成?

1 投票
1 回答
1960 浏览
提问于 2025-04-15 22:47

我正在尝试自动化一个下载过程。在这个过程中,我想知道某个特定文件的保存是否完成。场景是这样的:

  1. 使用Chrome或Firefox(任何浏览器)打开一个网站地址。
  2. 使用“Ctrl + S”将页面保存到磁盘上(我在Windows上工作)。
  3. 如果页面很大,保存需要几秒钟。我想在保存完成后解析HTML。

由于我无法控制浏览器的保存功能,所以我不知道保存是否完成。

我想到的一个主意是使用一个循环来获取文件的md5值,并与之前计算的值进行比较,直到之前的md5值和当前的md5值匹配为止。不过我觉得这个方法不太可行,因为浏览器似乎是先尝试将文件保存到一个临时文件中,然后再将内容复制到指定的文件(或者只是重命名文件)。

有没有什么好的想法?我使用Python进行自动化,所以任何可以用Python实现的想法都欢迎。

谢谢,Indrajith

1 个回答

6

在Windows系统上,你可以尝试以独占访问模式打开一个文件,这样可以检查这个文件是否正在被其他程序使用(比如被读取或写入)。我用这个方法来等待服务器端的FTP上传完成,下面是代码:

def check_file_ready(self, path):
    '''Check if file is not opened by another process.'''
    handle = None
    try:
        handle = win32file.CreateFile(
            path,
            win32file.GENERIC_WRITE,
            0,
            None,
            win32file.OPEN_EXISTING,
            win32file.FILE_ATTRIBUTE_NORMAL,
            None)
        return True
    except pywintypes.error, e:
        if e[0] == winerror.ERROR_SHARING_VIOLATION:
            # Note: other possible error codes include
            #  winerror.ERROR_FILE_NOT_FOUND
            #  winerror.ERROR_PATH_NOT_FOUND
            #  winerror.ERROR_ACCESS_DENIED.
            return False
        raise
    finally:
        if handle:
            win32file.CloseHandle(handle)

注意:这个函数会重新抛出所有的win32错误,除了共享冲突错误。在使用之前,你应该先检查文件是否存在,或者在函数中检查其他错误代码(可以参考第15行的注释)。

撰写回答