Python FTP目录操作
Python提供FTP协议客户端ftplib
。通过ftplib.FTP
类可以操作FTP服务器,但是这个客户端只提供了基本操作命令。目录的上传和删除操作便没有提供支持。
删除目录
在FTP协议中,提供命令rmdir
用于删除目录;对应的ftplib
提供FTP.rmd(dirname)
命令来删除目录。但是在删除目录时必须保证目录是空的,即被删除的目录中不能有任何目录或文件。
>>> from ftplib import FTP
>>> ftp = FTP('host', 'user', 'port')
>>> ftp.rmd('test')
上面的代码展示了rmd
的使用,但是若test
目录非空,就会报错。
ftplib.error_perm: 550 Remove directory operation failed.
故这里使用递归删除的方式实现对目录的删除。
import ftplib
class FTPPath(object):
lines = []
def __init__(self, path, user, password):
self.ftp = ftplib.FTP(path, user, password)
def __del__(self):
if self.ftp:
self.ftp.close()
def __clear_lines(self):
self.lines = []
def __save_line(self, line):
self.lines.append(line)
def delete_path(self, path):
"""
删除一个目录及其中全部的文件
由于FTP只能删除空目录,要递归删除
:param path:
:return:
"""
self.__clear_lines()
self.ftp.cwd(path)
self.ftp.retrlines("LIST", callback=self.__save_line)
self.ftp.cwd('/')
for line in self.lines:
name = path + "/" + line.split(" ")[-1]
if line[0] == "d":
self.delete_path(name)
else:
self.ftp.delete(name)
self.ftp.rmd(path)
上传目录
由于FTP协议没有给出上传目录及其中全部文件的命令,这里依然要使用递归上传的方式去处理目录。
import ftplib
import os
class FTPPath(object):
lines = []
def __init__(self, path, user, password):
self.ftp = ftplib.FTP(path, user, password)
def __upload_file(self, file_name):
"""
上传文件
:param file_name:
:return:
"""
upload_path = "/" + os.path.split(file_name)[0].replace("\\", '/')
with open(file_name, 'rb') as fd:
self.ftp.cwd(upload_path)
self.ftp.storbinary("STOR %s" % os.path.split(file_name)[-1], fd)
def upload_path(self, path):
"""
将路径下的文件全部上传
:param path:
:return:
"""
files = os.listdir(path)
pathname = os.path.split(path)[-1]
upload_path = "/" + os.path.split(path)[0].replace("\\", '/')
self.ftp.cwd(upload_path)
self.ftp.mkd(pathname)
for fi in files:
fi_d = os.path.join(path, fi)
if os.path.isdir(fi_d):
self.upload_path(fi_d)
else:
self.__upload_file(fi_d)