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)