2012-04-06 85 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() 
#-------------------------------------------------- 
相关问题