更新时间:2023-12-04 21:19:04
好的.假设您的 FTP 服务器支持 MLSD
命令,请使用以下代码制作一个模块(这是我用来将远程 FTP 站点与本地目录同步的脚本中的代码):
OK. Assuming your FTP server supports the MLSD
command, make a module with the following code (this is code from a script I use to sync a remote FTP site with a local directory):
# for python ≥ 2.6
import sys, os, time, ftplib
import collections
FTPDir= collections.namedtuple("FTPDir", "name size mtime tree")
FTPFile= collections.namedtuple("FTPFile", "name size mtime")
class FTPDirectory(object):
def __init__(self, path='.'):
self.dirs= []
self.files= []
self.path= path
def getdata(self, ftpobj):
ftpobj.retrlines('MLSD', self.addline)
def addline(self, line):
data, _, name= line.partition('; ')
fields= data.split(';')
for field in fields:
field_name, _, field_value= field.partition('=')
if field_name == 'type':
target= self.dirs if field_value == 'dir' else self.files
elif field_name in ('sizd', 'size'):
size= int(field_value)
elif field_name == 'modify':
mtime= time.mktime(time.strptime(field_value, "%Y%m%d%H%M%S"))
if target is self.files:
target.append(FTPFile(name, size, mtime))
else:
target.append(FTPDir(name, size, mtime, self.__class__(os.path.join(self.path, name))))
def walk(self):
for ftpfile in self.files:
yield self.path, ftpfile
for ftpdir in self.dirs:
for path, ftpfile in ftpdir.tree.walk():
yield path, ftpfile
class FTPTree(FTPDirectory):
def getdata(self, ftpobj):
super(FTPTree, self).getdata(ftpobj)
for dirname in self.dirs:
ftpobj.cwd(dirname.name)
dirname.tree.getdata(ftpobj)
ftpobj.cwd('..')
如果您想处理目录中的文件,您可以:
If you want to work on the files of a directory, you can:
import ftplib, time
quite_old= time.time() - 7*86400 # seven days
site= ftplib.FTP(hostname, username, password)
site.cwd(the_directory_to_work_on) # if it's '.', you can skip this line
folder= FTPDirectory()
folder.getdata(site) # get the filenames
for path, ftpfile in folder.walk():
if ftpfile.mtime < quite_old:
site.delete(ftpfile.name)
这应该做你想做的.
现在,如果这应该递归工作,您必须在单目录案例"的代码中进行以下两项更改:
Now, if this should work recursively, you'll have to do the following two changes in the code for "single directory case":
folder= FTPTree()
和
site.delete(os.path.join(path, ftpfile.name))
我使用过的服务器在 STOR
和 DELE
命令中的相对路径没有任何问题,因此 site.delete
使用相对路径也可以.如果您的 FTP 服务器需要无路径文件名,您应该首先将 .cwd
到 path
提供的 .delete
普通 ftpfile.name
然后 .cwd
回到基本文件夹.
The servers I've worked with didn't have any issues with relative paths in the STOR
and DELE
commands, so site.delete
with a relative path worked too. If your FTP server requires pathless filenames, you should first .cwd
to the path
provided, .delete
the plain ftpfile.name
and then .cwd
back to the base folder.