如何用Python检查文件保存是否完成?
我正在尝试自动化一个下载过程。在这个过程中,我想知道某个特定文件的保存是否完成。场景是这样的:
- 使用Chrome或Firefox(任何浏览器)打开一个网站地址。
- 使用“Ctrl + S”将页面保存到磁盘上(我在Windows上工作)。
- 如果页面很大,保存需要几秒钟。我想在保存完成后解析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行的注释)。