Python FTP目錄操作(FTP上傳和刪除目錄)

Python FTP目錄操作

Python提供FTP協(xié)議客戶端ftplib。通過ftplib.FTP類可以操作FTP服務(wù)器,但是這個(gè)客戶端只提供了基本操作命令。目錄的上傳和刪除操作便沒有提供支持。

刪除目錄

在FTP協(xié)議中,提供命令rmdir用于刪除目錄;對(duì)應(yīng)的ftplib提供FTP.rmd(dirname)命令來刪除目錄。但是在刪除目錄時(shí)必須保證目錄是空的,即被刪除的目錄中不能有任何目錄或文件。

>>> from ftplib import FTP
>>> ftp = FTP('host', 'user', 'port')
>>> ftp.rmd('test')

上面的代碼展示了rmd的使用,但是若test目錄非空,就會(huì)報(bào)錯(cuò)。

ftplib.error_perm: 550 Remove directory operation failed.

故這里使用遞歸刪除的方式實(shí)現(xiàn)對(duì)目錄的刪除。

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):
        """
        刪除一個(gè)目錄及其中全部的文件
        由于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協(xié)議沒有給出上傳目錄及其中全部文件的命令,這里依然要使用遞歸上傳的方式去處理目錄。

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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容