为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2021-07-08 14:15:12
我正在尝试创建一个脚本,该脚本将下载一个 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 字节等的信息,但是在实现它时没有任何运气。
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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

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

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

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

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

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

所以文件在退出with块时被刷新和关闭(当然,这个块之外执行文件读取操作)。


查看完整回答
反对 回复 2021-07-13
  • 1 回答
  • 0 关注
  • 294 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信