ftplib模块是Python中默认安装的,通过它定义的FTP类中的各个函数,可以完成对FTP服务器的操作,既能实现简单的ftp客户端,也可以连接或者操作FTP服务端,完成文件上传或下载。
1.函数介绍
ftplib模块中各个函数功能如下:
ftp=FTP()
ftp.set_debuglevel(2)
ftp.connect("IP","port")
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.dir()
ftp.pwd()
ftp.cwd(pathname)
ftp.mkd(pathname)
ftp.rmd(dirname)
ftp.delete(filename)
ftp.rename(oldname, newname)
ftp.storbinaly("STOR filename.txt",file_handel,bufsize)
ftp.retrbinary("RETR filename.txt",file_handel,bufsize)
2.实现向多个FTP服务器传输文件
实例:
向多个FTP服务器传输文件。
import ftplib
g_FtpServers&#61;[10.1.1.1,10.1.1.2,10.1.1.3]def DoFtpTrans(ZipOutputDir):global g_FtpServers FileNumCount &#61; 0FileSizeCount &#61; 0ErrorRemark &#61; &#39;&#39;if 0 >&#61; len(ZipOutputDir):ErrorRemark &#43;&#61; &#39;\t没有配置ZIP目录\n&#39;return FileNumCount,FileSizeCount,ErrorRemarkif 0 >&#61; len(g_FtpServers):ErrorRemark &#43;&#61; &#39;\t没有配置任何服务器\n&#39;return FileNumCount,FileSizeCount,ErrorRemarkTotalZipFileNum &#61; len(os.listdir(ZipOutputDir))CurrZipFilePos &#61; 0ZipFileNum &#61; TotalZipFileNum/len(g_FtpServers)if 0>&#61;ZipFileNum:return FileNumCount,FileSizeCount,ErrorRemarkif 0<g_MaxFileCountPerFtp and g_MaxFileCountPerFtp<ZipFileNum:ZipFileNum &#61; g_MaxFileCountPerFtpZipFileList &#61; os.listdir(ZipOutputDir)ZipFileListCount &#61; len(ZipFileList)for FtpServer in g_FtpServers: FtpConnect &#61; ftplib.FTP() try:FtpConnect.connect(FtpServer[0], FtpServer[1], 30)except:ErrorRemark &#43;&#61; &#39;\t连接ftp(&#39;&#43;FtpServer[0]&#43;&#39;:&#39;&#43;FtpServer[1]&#43;&#39;)失败&#39;&#43;&#39;\n&#39;continuetry:FtpConnect.login(FtpServer[2], FtpServer[3])except:ErrorRemark &#43;&#61; &#39;\t使用&#39;&#43;FtpServer[2]&#43;&#39;,&#39;&#43;FtpServer[3]&#43;&#39;登录ftp(&#39;&#43;FtpServer[0]&#43;&#39;:&#39;&#43;FtpServer[1]&#43;&#39; )失败&#39;&#43;&#39;\n&#39;FtpConnect.quit()continueif 0 < len(FtpServer[4]):try:FtpConnect.cwd(FtpServer[4])except:ErrorRemark &#43;&#61; &#39;\t重定位到 &#39;&#43;&#39;ftp(&#39;&#43;FtpServer[0]&#43;&#39;:&#39;&#43;FtpServer[1]&#43;&#39;)上的&#39;&#43;FtpServer[4]&#43;&#39;目录失败&#39;&#43;&#39;\n&#39;FtpConnect.quit()continueZipFileTransCount &#61; 0NewZipFile &#61; &#39;&#39;ZipFileBasename &#61; &#39;&#39;RenameSucess &#61; Falsewhile ZipFileListCount > CurrZipFilePos:if ZipFileNum <&#61; ZipFileTransCount:break;if False &#61;&#61; os.path.isfile(ZipOutputDir&#43;&#39;/&#39;&#43;ZipFileList[CurrZipFilePos]):CurrZipFilePos &#43;&#61; 1continueZipFileTransCount &#61; ZipFileTransCount&#43;1ZipFileBasename &#61; os.path.basename(ZipFileList[CurrZipFilePos])if -1 &#61;&#61; ZipFileBasename.find(&#39;.zip&#39;):CurrZipFilePos &#43;&#61; 1continueif -1 !&#61; ZipFileBasename.find(&#39;.ziping&#39;):CurrZipFilePos &#43;&#61; 1continueif -1 &#61;&#61; ZipFileBasename.find(&#39;.zip|&#39;):try:os.rename(ZipOutputDir&#43;&#39;/&#39;&#43;ZipFileList[CurrZipFilePos], ZipOutputDir&#43;&#39;/&#39;&#43;ZipFileList[CurrZipFilePos]&#43;&#39;|&#39;&#43;FtpServer[0])except:continueNewZipFile &#61; ZipFileList[CurrZipFilePos]&#43;&#39;|&#39;&#43;FtpServer[0]else:NewZipFile &#61; ZipFileList[CurrZipFilePos]ZipFileBasename &#61; os.path.basename(NewZipFile)NameInFtp &#61; GetFileNameInFtp(ZipFileBasename)ClassDirInFtp &#61; GetDirNameInFtp(ZipFileBasename)DataDirInFtp &#61; time.strftime(&#39;%Y%m%d/&#39;,time.localtime(time.time()))DirInFtp &#61; &#39;&#39;if 0<len(ClassDirInFtp):DirInFtp &#43;&#61; &#39;EntityFile/&#39;&#43;ClassDirInFtp&#43;DataDirInFtpif False &#61;&#61; os.path.isfile(ZipOutputDir&#43;&#39;/&#39;&#43;NewZipFile):CurrZipFilePos &#43;&#61; 1continueZipFileBasename &#61; ZipFileBasename.replace(&#39;|&#39;&#43;FtpServer[0], &#39;&#39;)try:FtpConnect.storbinary(&#39;STOR &#39;&#43;ZipFileBasename&#43;&#39;|&#39;&#43;FtpServer[0], open(ZipOutputDir&#43;&#39;/&#39;&#43;NewZipFile,&#39;rb&#39;))except:try:FtpConnect.delete(ZipFileBasename&#43;&#39;|&#39;&#43;FtpServer[0])except:ErrorRemark &#43;&#61; &#39;&#39;ErrorRemark &#43;&#61; &#39;\t上传文件&#39;&#43;ZipFileBasename&#43;&#39;|&#39;&#43;FtpServer[0]&#43;&#39;到ftp(&#39;&#43;FtpServer[0]&#43;&#39;)失败&#39;&#43;&#39;\n&#39;CurrZipFilePos &#43;&#61; 1continueRenameSucess &#61; Truetry:FtpConnect.rename(ZipFileBasename&#43;&#39;|&#39;&#43;FtpServer[0], DirInFtp&#43;NameInFtp)except:RenameSucess &#61; Falseif 0>&#61;len(DirInFtp):try:FtpConnect.delete(ZipFileBasename&#43;&#39;|&#39;&#43;FtpServer[0])except:ErrorRemark &#43;&#61; &#39;&#39;ErrorRemark &#43;&#61; &#39;\t重命名ftp(&#39;&#43;FtpServer[0]&#43;&#39;)上的文件&#39;&#43;ZipFileBasename&#43;&#39;|&#39;&#43;FtpServer[0]&#43;&#39;失败&#39;&#43;&#39;\n&#39;CurrZipFilePos &#43;&#61; 1continueif False&#61;&#61;RenameSucess and 0<len(DirInFtp):try:FtpConnect.mkd(&#39;EntityFile/&#39;)except:ErrorRemark &#43;&#61; &#39;\t在ftp(&#39;&#43;FtpServer[0]&#43;&#39;)上建立目录&#39;&#43;&#39;EntityFile/&#39;&#43;&#39;失败&#39;&#43;&#39;\n&#39;try:FtpConnect.mkd(&#39;EntityFile/&#39;&#43;ClassDirInFtp)except:ErrorRemark &#43;&#61; &#39;\t在ftp(&#39;&#43;FtpServer[0]&#43;&#39;)上建立目录&#39;&#43;&#39;EntityFile/&#39;&#43;ClassDirInFtp&#43;&#39;失败&#39;&#43;&#39;\n&#39;try:FtpConnect.mkd(&#39;EntityFile/&#39;&#43;ClassDirInFtp&#43;DataDirInFtp)except:ErrorRemark &#43;&#61; &#39;\t在ftp(&#39;&#43;FtpServer[0]&#43;&#39;)上建立目录&#39;&#43;&#39;EntityFile/&#39;&#43;ClassDirInFtp&#43;DataDirInFtp&#43;&#39;失败&#39;&#43;&#39;\n&#39;try:FtpConnect.rename(ZipFileBasename&#43;&#39;|&#39;&#43;FtpServer[0], DirInFtp&#43;NameInFtp)except:try:FtpConnect.delete(ZipFileBasename&#43;&#39;|&#39;&#43;FtpServer[0])except:ErrorRemark &#43;&#61; &#39;&#39;CurrZipFilePos &#43;&#61; 1continueFileNumCount &#43;&#61; 1FileSizeCount &#43;&#61; os.path.getsize(ZipOutputDir&#43;&#39;/&#39;&#43;NewZipFile)try:os.remove(ZipOutputDir&#43;&#39;/&#39;&#43;NewZipFile)except:ErrorRemark &#43;&#61; &#39;\t移除文件&#39;&#43;ZipOutputDir&#43;&#39;/&#39;&#43;NewZipFile&#43;&#39;失败\n&#39;CurrZipFilePos &#43;&#61; 1try:FtpConnect.quit()except:ErrorRemark &#43;&#61; &#39;\t退出ftp(&#39;&#43;FtpServer[0]&#43;&#39;)时发生错误&#39;&#43;&#39;\n&#39;return FileNumCount,FileSizeCount,ErrorRemark
每天进步一点点、快乐一点点、开心一点点&#xff01;good&#xff0c;come on&#xff01;Girl&#xff01;