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

我正在尝试创建一个脚本,该脚本将下载一个 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 字节等的信息,但是在实现它时没有任何运气。


一只萌萌小番薯
浏览 316回答 1
1回答

ABOUTYOU

可能是因为这种不好的做法单行: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块时被刷新和关闭(当然,在这个块之外执行文件读取操作)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python