通过FTP下载时无法识别Zipfile

2024-10-06 12:37:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个脚本,它将下载一个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”。在

有谁知道为什么会这样吗? 我检查了以下内容:

  • 正确的文件夹
  • 下载zip文件,解压缩并重新压缩(然后脚本将提取它)

编辑

我一直在读IO字节之类的东西,但是没有任何实现它的运气。在


Tags: 文件服务器脚本serverwindowsconnectftplogin
1条回答
网友
1楼 · 发布于 2024-10-06 12:37:33

可能是因为这个坏习惯一句话:

ftp.retrbinary("RETR " + filename ,open(tempfile, 'wb').write)

open(tempfile, 'wb').write不保证文件何时关闭。您不会将open返回的句柄存储在任何地方,因此您无法决定何时close该文件(并确保磁盘完全写入)。在

因此,当试图以读取模式打开文件时,文件的最后一部分可能还没有写入磁盘。而链接下载+解压可能会触发该错误(当两个单独的执行剩下时间来刷新和关闭文件时)

最好使用这样的上下文管理器:

^{pr2}$

因此,当退出with块时,文件被刷新并关闭(当然,在该块之外执行文件读取操作)。在

相关问题 更多 >