ftplib模块是Python中默认安装的,通过它定义的FTP类中的各个函数,可以完成对FTP服务器的操作,既能实现简单的ftp客户端,也可以连接或者操作FTP服务端,完成文件上传或下载。
1.函数介绍
ftplib模块中各个函数功能如下:
ftp=FTP() #设置变量 ,实例化
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect("IP","port") #连接的ftp sever和端口
ftp.login("user","password") #连接的用户名,密码
print ftp.getwelcome() #打印出欢迎信息
ftp.cmd("xxx/xxx") #更改远程目录
bufsize=1024 #设置的缓冲区大小
filename="filename.txt" #需要下载的文件
file_handle=open(filename,"wb").write
#以写模式在本地打开文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize)
#接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit #退出ftp
ftp.dir() #显示目录下文件信息
ftp.pwd() #返回当前所在位置
ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.mkd(pathname) #新建远程目录
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(oldname, newname) #将oldname修改名称为newname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP目标文件
2.实现向多个FTP服务器传输文件
实例:
向多个FTP服务器传输文件。
#!/usr/bin/python
#-*- coding:utf-8 -*-
#功能:远程传输Zip文件
import ftplib #加载ftp模块
#配置FTP服务器
g_FtpServers=[10.1.1.1,10.1.1.2,10.1.1.3]
def DoFtpTrans(ZipOutputDir):
global g_FtpServers
FileNumCount = 0
FileSizeCount = 0
ErrorRemark = ''
if 0 >= len(ZipOutputDir):
ErrorRemark += '\t没有配置ZIP目录\n'
return FileNumCount,FileSizeCount,ErrorRemark
if 0 >= len(g_FtpServers):
ErrorRemark += '\t没有配置任何服务器\n'
return FileNumCount,FileSizeCount,ErrorRemark
#目录下zip文件总数
TotalZipFileNum = len(os.listdir(ZipOutputDir))
CurrZipFilePos = 0
ZipFileNum = TotalZipFileNum/len(g_FtpServers)
if 0>=ZipFileNum:
return FileNumCount,FileSizeCount,ErrorRemark
if 0<g_MaxFileCountPerFtp and g_MaxFileCountPerFtp<ZipFileNum:
ZipFileNum = g_MaxFileCountPerFtp
#开始传输
ZipFileList = os.listdir(ZipOutputDir)
ZipFileListCount = len(ZipFileList)
for FtpServer in g_FtpServers:
FtpConnect = ftplib.FTP()
try:
FtpConnect.connect(FtpServer[0], FtpServer[1], 30)
except:
ErrorRemark += '\t连接ftp('+FtpServer[0]+':'+FtpServer[1]+')失败'+'\n'
#FtpConnect.quit()
continue
try:
FtpConnect.login(FtpServer[2], FtpServer[3])
except:
ErrorRemark += '\t使用'+FtpServer[2]+','+FtpServer[3]+'登录ftp('+FtpServer[0]+':'+FtpServer[1]+' )失败'+'\n'
FtpConnect.quit()
continue
if 0 < len(FtpServer[4]):
try:
FtpConnect.cwd(FtpServer[4])
except:
ErrorRemark += '\t重定位到 '+'ftp('+FtpServer[0]+':'+FtpServer[1]+')上的'+FtpServer[4]+'目录失败'+'\n'
FtpConnect.quit()
continue
#
ZipFileTransCount = 0
NewZipFile = ''
ZipFileBasename = ''
RenameSucess = False
while ZipFileListCount > CurrZipFilePos:
#
if ZipFileNum <= ZipFileTransCount:
break;
#
if False == os.path.isfile(ZipOutputDir+'/'+ZipFileList[CurrZipFilePos]):
CurrZipFilePos += 1
continue
ZipFileTransCount = ZipFileTransCount+1
#
ZipFileBasename = os.path.basename(ZipFileList[CurrZipFilePos])
if -1 == ZipFileBasename.find('.zip'):
CurrZipFilePos += 1
continue
if -1 != ZipFileBasename.find('.ziping'):
CurrZipFilePos += 1
continue
#
if -1 == ZipFileBasename.find('.zip|'):
try:
os.rename(ZipOutputDir+'/'+ZipFileList[CurrZipFilePos], ZipOutputDir+'/'+ZipFileList[CurrZipFilePos]+'|'+FtpServer[0])
except:
continue
NewZipFile = ZipFileList[CurrZipFilePos]+'|'+FtpServer[0]
else:
NewZipFile = ZipFileList[CurrZipFilePos]
ZipFileBasename = os.path.basename(NewZipFile)
#get name adn dir
NameInFtp = GetFileNameInFtp(ZipFileBasename)
ClassDirInFtp = GetDirNameInFtp(ZipFileBasename)
DataDirInFtp = time.strftime('%Y%m%d/',time.localtime(time.time()))
DirInFtp = ''
if 0<len(ClassDirInFtp):
DirInFtp += 'EntityFile/'+ClassDirInFtp+DataDirInFtp
#
#if -1 == ZipFileBasename.find('|'+FtpServer[0]):
# continue
if False == os.path.isfile(ZipOutputDir+'/'+NewZipFile):
CurrZipFilePos += 1
continue
#
ZipFileBasename = ZipFileBasename.replace('|'+FtpServer[0], '')
try:
FtpConnect.storbinary('STOR '+ZipFileBasename+'|'+FtpServer[0], open(ZipOutputDir+'/'+NewZipFile,'rb'))
except:
#出错删除文件
try:
FtpConnect.delete(ZipFileBasename+'|'+FtpServer[0])
except:
ErrorRemark += ''
ErrorRemark += '\t上传文件'+ZipFileBasename+'|'+FtpServer[0]+'到ftp('+FtpServer[0]+')失败'+'\n'
CurrZipFilePos += 1
continue
RenameSucess = True
try:
FtpConnect.rename(ZipFileBasename+'|'+FtpServer[0], DirInFtp+NameInFtp)
except:
RenameSucess = False
if 0>=len(DirInFtp):
#出错删除文件
try:
FtpConnect.delete(ZipFileBasename+'|'+FtpServer[0])
except:
ErrorRemark += ''
ErrorRemark += '\t重命名ftp('+FtpServer[0]+')上的文件'+ZipFileBasename+'|'+FtpServer[0]+'失败'+'\n'
CurrZipFilePos += 1
continue
#处理目录
if False==RenameSucess and 0<len(DirInFtp):
try:
FtpConnect.mkd('EntityFile/')
except:
ErrorRemark += '\t在ftp('+FtpServer[0]+')上建立目录'+'EntityFile/'+'失败'+'\n'
try:
FtpConnect.mkd('EntityFile/'+ClassDirInFtp)
except:
ErrorRemark += '\t在ftp('+FtpServer[0]+')上建立目录'+'EntityFile/'+ClassDirInFtp+'失败'+'\n'
try:
FtpConnect.mkd('EntityFile/'+ClassDirInFtp+DataDirInFtp)
except:
ErrorRemark += '\t在ftp('+FtpServer[0]+')上建立目录'+'EntityFile/'+ClassDirInFtp+DataDirInFtp+'失败'+'\n'
try:
FtpConnect.rename(ZipFileBasename+'|'+FtpServer[0], DirInFtp+NameInFtp)
except:
#出错删除文件
try:
FtpConnect.delete(ZipFileBasename+'|'+FtpServer[0])
except:
ErrorRemark += ''
CurrZipFilePos += 1
continue
#记录文件的个数and大小
FileNumCount += 1
FileSizeCount += os.path.getsize(ZipOutputDir+'/'+NewZipFile)
#将文件移除或者搬走
try:
os.remove(ZipOutputDir+'/'+NewZipFile)
except:
ErrorRemark += '\t移除文件'+ZipOutputDir+'/'+NewZipFile+'失败\n'
CurrZipFilePos += 1
#
try:
FtpConnect.quit()
except:
ErrorRemark += '\t退出ftp('+FtpServer[0]+')时发生错误'+'\n'
#
return FileNumCount,FileSizeCount,ErrorRemark
每天进步一点点、快乐一点点、开心一点点!good,come on!Girl!