热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python:ftplib向FTP服务器上传或下载文件

ftplib模块是Python中默认安装的,通过它定义的FTP类中的各个函数,可以完成对FTP服务器的操作,既能实现简单的ftp客户端,也可以连接或者操

ftplib模块是Python中默认安装的,通过它定义的FTP类中的各个函数,可以完成对FTP服务器的操作,既能实现简单的ftp客户端,也可以连接或者操作FTP服务端,完成文件上传或下载。

1.函数介绍

ftplib模块中各个函数功能如下:
FTP常用函数

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&#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,ErrorRemark#目录下zip文件总数TotalZipFileNum &#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_MaxFileCountPerFtp#开始传输ZipFileList &#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;#FtpConnect.quit()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()continue#ZipFileTransCount &#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;1#ZipFileBasename &#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; 1continue#if -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)#get name adn dirNameInFtp &#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;DataDirInFtp##if -1 &#61;&#61; ZipFileBasename.find(&#39;|&#39;&#43;FtpServer[0]):# continueif False &#61;&#61; os.path.isfile(ZipOutputDir&#43;&#39;/&#39;&#43;NewZipFile):CurrZipFilePos &#43;&#61; 1continue#ZipFileBasename &#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; 1continue#处理目录if 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; 1continue#记录文件的个数and大小FileNumCount &#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; 1#try: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;


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在CentOS 7.x上进行端口映射配置的方法,通过修改内核和配置防火墙实现端口映射。作者分享了自己使用华为服务器进行端口映射的经验,发现网速比直连还快且稳定。详细的配置过程包括开启系统路由模式功能、设置IP地址伪装、设置端口映射等。同时,还介绍了如何监听本地端口的tcp请求,以及删除规则和开放的端口的方法。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
author-avatar
手机用户2602885351
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有