gpt4 book ai didi

python - 通过 FTP 下载时无法识别 Zip 文件

转载 作者:行者123 更新时间:2023-12-01 01:32:14 25 4
gpt4 key购买 nike

我正在尝试创建一个脚本来下载 ZIP 文件并将其解压。

我在 Windows Server 2016 上使用 Python 2.7。

我创建了一个如下所示的下载脚本:

ftp = FTP()
ftp.connect("***")
ftp.login("***","***")
ftp.cwd(ftppath)
ftp.retrbinary("RETR " + filename ,open(tempfile, 'wb').write)
ftp.quit()

还有一个 zip 提取脚本:

zip_ref = zipfile.ZipFile(tempfile, 'r')
zip_ref.extractall(localpath)
zip_ref.close()

这些工作独立进行。含义:如果我在测试 ZIP 文件上运行提取脚本,它将提取该文件。另外,如果我从服务器运行 FTP 脚本,它将下载该文件。

但是!如果我一起运行脚本,这意味着我从 FTP 服务器下载文件然后解压它,它将返回错误:“文件不是 Zip 文件”。

谁知道为什么会发生这种情况?我已经检查了以下内容:

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

编辑

我一直在阅读有关 IO 字节等的内容,但是在实现它方面没有任何运气。

最佳答案

可能是因为这种不好的做法:

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

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

因此,当尝试以读取模式打开文件时,文件的最后部分可能尚未写入磁盘。并且链接下载+解压缩可以触发该错误(当两次单独的执行留下刷新和关闭文件的时间时)

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

with open(tempfile, 'wb') as f:
ftp.retrbinary("RETR " + filename ,f.write)

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

关于python - 通过 FTP 下载时无法识别 Zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52746654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com