2012-04-06 86 views
3

我想通過FTP連接地址,然後刪除所有內容之後。目前我使用此代碼:刪除所有文件和文件夾連接到FTP

from ftplib import FTP 
import shutil 
import os 

ftp = FTP('xxx.xxx.xxx.xxx') 
ftp.login("admin", "admin") 

for ftpfile in ftp.nlst(): 
    if os.path.isdir(ftpfile)== True: 
     shutil.rmtree(ftpfile) 
    else: 
     os.remove(ftpfile) 

我的問題是我總是當他試圖刪除的第一個文件這個錯誤:

os.remove(ftpfile) 
WindowsError: [Error 2] The system cannot find the file specified: somefile.sys 

任何人有一個想法,爲什麼?

+1

這有點難以分辨,但它看起來像是使用命令從本地系統中刪除文件,而不是刪除遠程文件。你可以編輯你的原始問題,並提供更多的細節?如果您沒有得到答案,我會在下週發佈我們的水資源AMR項目的一些源代碼。我現在不在工作。你爲什麼使用其他Python模塊?正是這種細節會幫助我們幫助你。 tnx – octopusgrabbus 2012-04-06 13:07:18

+0

嗯,我通過ftp(前兩行)連接,然後遍歷該服務器上的文件(我可以打印它們),然後我想逐個刪除它們(文件和文件夾)。第一個模塊用於ftp連接,第二個用於刪除目錄,第三個用於刪除文件。 – Kobe 2012-04-06 13:16:49

回答

0
ftp.nlst() 

上面的語句返回的文件名的列表。

os.remove() 

上面的語句需要文件路徑

+0

是的,我迭代列表並試圖刪除該文件,我不認爲我需要一個路徑在這裏 – Kobe 2012-04-06 12:38:42

+1

但不os.remove()本地刪除,而不是遠程對應於什麼ftp.nlst()返回?我錯過了什麼? – octopusgrabbus 2012-04-06 13:43:38

+0

http://docs.python.org/library/os.html表示os.remove()的參數是路徑而不僅僅是文件名。 – pravin 2012-04-06 13:43:46

5
for something in ftp.nlst(): 
    try: 
      ftp.delete(something) 
    except Exception: 
      ftp.rmd(something) 

其他方法嗎?

+0

這不起作用如果目錄非空 – Parham 2017-08-04 16:52:10

0
from ftplib import FTP 
#-------------------------------------------------- 
class FTPCommunicator(): 

    def __init__(self): 

     self.ftp = FTP() 
     self.ftp.connect('server', port=21, timeout=30) 
     self.ftp.login(user="user", passwd="password") 

    def getDirListing(self, dirName): 

     listing = self.ftp.nlst(dirName) 

     # If listed a file, return. 
     if len(listing) == 1 and listing[0] == dirName: 
      return [] 

     subListing = [] 
     for entry in listing: 
      subListing += self.getDirListing(entry) 

     listing += subListing 

     return listing 

    def removeDir(self, dirName): 

     listing = self.getDirListing(dirName) 

     # Longest path first for deletion of sub directories first. 
     listing.sort(key=lambda k: len(k), reverse=True) 

     # Delete files first. 
     for entry in listing: 
      try: 
       self.ftp.delete(entry) 
      except: 
       pass 

     # Delete empty directories. 
     for entry in listing: 
      try: 
       self.ftp.rmd(entry) 
      except: 
       pass 

     self.ftp.rmd(dirName) 

    def quit(self): 

     self.ftp.quit() 
#-------------------------------------------------- 
def main(): 

    ftp = FTPCommunicator() 
    ftp.removeDir("/Untitled") 
    ftp.quit() 
#-------------------------------------------------- 
if __name__ == "__main__": 
    main() 
#-------------------------------------------------- 
相關問題