Python FTP遍历删除文件夹

转载请注明出处

http://blog.csdn.net/xugangjava/article/details/7401906


总体思路是:使用递归来 遍历文件 和文件夹  遍历过程中 直接删除掉 文件 将文件夹路径添加到列表中

yield 操作是在  for 递归遍历子文件夹 之后 所以先返回的是子文件夹 

这时返回的文件夹肯定是空文件夹 ,使用rm命令就可以直接删除掉文件夹了


下面是核心代码

# -*- coding:gbk -*-
# Author:       许刚
# Created:      2012/3/28
import sitecustomize
import thread
from wx import _misc
from ftplib import FTP
import wx,os,uuid,socket,sys,time,re
from twisted.python import log
import wx.lib.agw.ultimatelistctrl as ULC
from msgbox import *
from db import Cfg
from win32com.shell import shell, shellcon 
from win32con import FILE_ATTRIBUTE_NORMAL
from base import PanelWarpCtrl,FileItem,FileImageList

########################################################################
class FtpHandler(FTP):
	"""ftp uploader handler"""
	#blocksize=65536
	def connect(self):
		return self.login(Cfg.c_name,Cfg.c_pwd)

	def login(self,name,pwd):
		try:
			FTP.connect(self,Cfg.c_ftpurl,int(Cfg.c_ftpport))
		except:
			log.err(sys.exc_info())
			MessageBoxError('无法连接上传服务器!')
			return False
		try:
			FTP.login(self,name,pwd)
		except:
			log.err(sys.exc_info())
			MessageBoxError('无法连接上传服务器,\n用户名或密码错误!')
			return False
		return True
	
	def delete(self, filename):
		'''Delete a file.'''
		self.sendcmd('DELE ' + filename)
		
	def mlsd(self,callback = None):
		self.retrlines('MLSD',callback)
	
	def listdir(self,root):
		items=[]
		self.mlsd(lambda x:items.append(FileItem(x)))			
		return items
	
	def deletedir(self,root):
		def walk(root):
			dirs = []
			def ParseLine(line):
				f=FileItem(line)
				if f.isdir:
					dirs.append(os.path.join(root,f.fname))
				else:
					self.delete(f.fname)
			self.cwd(root)
			self.mlsd(ParseLine)
			for name in dirs:
				new_path = os.path.join(root, name)
				for x in walk(new_path):yield x	
			yield dirs	

		for dirs in walk(root):
			for d in dirs:
				self.rmd(d)
		self.rmd(root)



其中FileItem用来解析 Ftp 返回的文件列表

mport wx
import re,os
from wx import MimeTypesManager
from win32com.shell import shell, shellcon  
from win32con import FILE_ATTRIBUTE_NORMAL  
mimeTypeManager=MimeTypesManager()



########################################################################
class FileItem:
	pattern=re.compile('modify=(?P<modify>\d+);perm=(?P<perm>\w+);size=(?P<size>\d+);type=(?P<type>\w+);\s(?P<filename>.*)')
	def __init__(self,line):
		m=FileItem.pattern.search(line)		
		self.isdir=m.group('type')=='dir'
		self.size='' if self.isdir else m.group('size')
		self.time='' if self.isdir else m.group('modify')
		self.fname=m.group('filename')
		self.ext=os.path.splitext(self.fname)[-1]				
	def GetDesc(self):
		desc=''
		if self.isdir:
			desc='文件夹'
		elif self.ext:
			fileType=mimeTypeManager.GetFileTypeFromExtension(self.ext)
			if fileType:
				desc=fileType.GetDescription()
				if desc is None:
					desc=''
		return desc	
	

最后运行结果





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值