我正在嘗試創(chuàng)建一個腳本,該腳本將下載一個 ZIP 文件并將其解壓縮。我在 Windows Server 2016 上使用 Python 2.7。我創(chuàng)建了一個看起來像這樣的下載腳本: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()這些獨(dú)立工作。含義:如果我在我的測試 ZIP 文件上運(yùn)行提取腳本,它將提取該文件。此外,如果我從我的服務(wù)器運(yùn)行 FTP 腳本,它將下載文件。然而!如果我一起運(yùn)行腳本,這意味著我從我的 FTP 服務(wù)器下載文件然后解壓縮它,它將返回一個錯誤:“文件不是 Zip 文件”。有誰知道為什么會這樣?我檢查了以下內(nèi)容:正確的文件夾下載 zip 文件,解壓并重新壓縮(然后腳本將解壓它)編輯我一直在閱讀有關(guān) IO 字節(jié)等的信息,但是在實(shí)現(xiàn)它時沒有任何運(yùn)氣。
1 回答

ABOUTYOU
TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個贊
可能是因?yàn)檫@種不好的做法單行:
ftp.retrbinary("RETR " + filename ,open(tempfile, 'wb').write)
open(tempfile, 'wb').write
不給任何擔(dān)保文件時,將被關(guān)閉。您不會在open
任何地方存儲返回的句柄,因此您無法決定何時close
寫入文件(并確保完整的磁盤寫入)。
因此,當(dāng)嘗試以讀取模式打開文件時,文件的最后一部分可能尚未寫入磁盤。并且鏈接下載 + 解壓縮可以觸發(fā)錯誤(當(dāng) 2 個單獨(dú)的執(zhí)行留下刷新和關(guān)閉文件的時間時)
最好使用這樣的上下文管理器:
with open(tempfile, 'wb') as f: ftp.retrbinary("RETR " + filename ,f.write)
所以文件在退出with
塊時被刷新和關(guān)閉(當(dāng)然,在這個塊之外執(zhí)行文件讀取操作)。
添加回答
舉報(bào)
0/150
提交
取消