我正在尝试创建一个脚本,该脚本将下载一个 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
块时被刷新和关闭(当然,在这个块之外执行文件读取操作)。
添加回答
举报
0/150
提交
取消