我正在尝试创建一个脚本,它将下载一个ZIP文件并将其解压缩。在
在Windows Server 2016上使用Python am 2.2016。在
我创建了一个下载脚本,如下所示:
ftp = FTP()
ftp.connect("***")
ftp.login("***","***")
ftp.cwd(ftppath)
ftp.retrbinary("RETR " + filename ,open(tempfile, 'wb').write)
ftp.quit()
以及一个压缩解压缩脚本:
^{pr2}$这些工作独立进行。意思:如果我在测试ZIP文件上运行提取脚本,它将提取该文件。另外,如果我从服务器上运行FTP脚本,它将下载该文件。在
但是!如果我一起运行这些脚本,这意味着我从FTP服务器下载文件,然后提取它,它将返回一个错误:“file is not a Zip file”。在
有谁知道为什么会这样吗? 我检查了以下内容:
编辑
我一直在读IO字节之类的东西,但是没有任何实现它的运气。在
可能是因为这个坏习惯一句话:
open(tempfile, 'wb').write
不保证文件何时关闭。您不会将open
返回的句柄存储在任何地方,因此您无法决定何时close
该文件(并确保磁盘完全写入)。在因此,当试图以读取模式打开文件时,文件的最后一部分可能还没有写入磁盘。而链接下载+解压可能会触发该错误(当两个单独的执行剩下时间来刷新和关闭文件时)
最好使用这样的上下文管理器:
^{pr2}$因此,当退出
with
块时,文件被刷新并关闭(当然,在该块之外执行文件读取操作)。在相关问题 更多 >
编程相关推荐