Python FTP目录操作(FTP上传和删除目录)

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)

你可能感兴趣的:(Python FTP目录操作(FTP上传和删除目录))