iT邦幫忙

0

Python PermissionError: [WinError 32] 程序無法存取檔案,因為檔案正由另一個程序使用

  • 分享至 

  • xImage

小弟是python新手,為了實現從FTP抓下檔案後,壓縮成zip檔,從網路上去找了以下的code來實現我要的目的‧在壓縮成zip檔備份後,要刪除從ftp抓下的檔案,用在壓縮成zip檔備份後,要刪除從ftp抓下的檔案,用shutil.remtree時最後會有一個error顯示有一個檔案正由另一個程序使用而沒辦法完全清除‧ 請問我該如何可以在最後把下載的檔案全部刪除‧

#判斷及增加從FTP下載到本地資料夾
import os,os.path

if not os.path.exists(localdir):
os.makedirs(localdir)

#從FTP下載到本地資料夾

from ftplib import FTP

ftp = FTP()
timeout = 30
port = 21
ftp.connect('xx.xx.xx.xx', port, timeout) # 連線FTP伺服器
ftp.login('user', 'pass') # 登入
print(ftp.getwelcome() ) # 獲得歡迎資訊
ftp.cwd(remotedir) # 設定FTP路徑
list = ftp.nlst() # 獲得目錄列表
print(list)
for name in list:
print(name) # 列印檔名字
path = localdir + name # 檔案儲存路徑
f = open(path, 'wb') # 開啟要儲存檔案
filename = 'RETR ' + name # 儲存FTP檔案
ftp.retrbinary(filename, f.write) # 儲存FTP上的檔案
#ftp.delete(name) # 刪除FTP檔案
#ftp.storbinary('STOR ' + filename, open(path, 'rb')) # 上傳FTP檔案
ftp.quit() # 退出FTP伺服器

#壓所資料夾成zip

import zipfile
def zip_dir(dirname,zipfilename):
filelist = []
if os.path.isfile(dirname):
filelist.append(dirname)
else :
for root, dirs, files in os.walk(dirname):
for name in files:
filelist.append(os.path.join(root, name))
zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
arcname = tar[len(dirname):]
#print arcname
zf.write(tar,arcname)
zf.close()

if name == 'main':
zip_dir(localdir, backupdir)

#刪除資料夾

import shutil

if os.path.exists(localdir):
shutil.rmtree(localdir)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
rogeryao
iT邦超人 7 級 ‧ 2021-03-11 14:40:51
最佳解答
f = open(path, 'wb') # 開啟要儲存檔案
改用
with open(path, 'wb' ) as f :
ftp.retrbinary(filename, f.write) # 儲存FTP上的檔案
加入
f.close()
2
japhenchen
iT邦超人 1 級 ‧ 2021-03-11 13:13:45

可以整理一下你的原始碼,放到 < > 的程式框裡嗎?這樣看好辛苦,且請把你的錯誤訊息也完整PO上來

最後一行加個參數試試

    shutil.rmtree(localdir, ignore_errors=True)

我要發表回答

立即登入回答