Python实现FTP文件传输的实例


Posted in Python onJuly 07, 2019

FTP一般流程

FTP对应PASV和PORT两种访问方式,分别为被动和主动,是针对FTP服务器端进行区分的,正常传输过程中21号端口用于指令传输,数据传输端口使用其他端口。

PASV:由客户端发起数据传输请求,服务器端返回并携带数据端口,并且服务器端开始监听此端口等待数据,为被动模式;

PORT:客户端监听端口并向服务器端发起请求,服务器端主动连接此端口进行数据传输,为主动模式。

Python实现FTP文件传输的实例

其中TYPE分两种模式,I对应二进制模式、A对应ASCII模式;

PASV为客户端发送请求,之后227为服务器端返回操作码表示成功,并且后面带有服务器端监听的端口:143x256(左移8位)+48

之后通过STOR命令进行数据下载,下载完成后返回226表示数据传输完成。

2. Python代码实现:

中文路径问题:由于FTP支持ASCII编码,Python ftplib中编码方式使用latin-1,而window默认编码方式为gbk,所以使用Python处理时需先将中文路径编码为gbk之后译码为latin-1字符;

上传下载使用storline和retrline,对应二进制使用storbinary和retrbinary。对于stor类函数后面的参数fp表示接收一个文件对象,支持read方法,一般为打开需要上传的源文件,而retr类函数后面的参数表示对于返回数据的处理方法。

从一个FTP服务器到另一个FTP服务器的数据传输:

利用本地电脑作为数据缓存,但并不将数据保存到硬盘,只在内存中存储进行数据传输;其中一端作为下载一端为数据上传。

首先登陆两个FTP服务器,transfercmd函数用于发送命令并返回已建立好连接的本地Socket,此时分别在两个本地Socket进行数据的收发即可。

在测试中发现,在发送完一个文件之后只有及时的关闭socket,21端口才会返回226,数据完成指示,这样才可以循环下一个文件,在完成之后要退出FTP。

#coding=utf-8

import ftplib,os.path,os
import socket

f1=ftplib.FTP('172.16.2.76')
f2=ftplib.FTP('172.16.25.153')


class myFTP:
    path='file/download/bbb/'
    # ftplib中编码使用latin-1
    title='版本'.encode(encoding='gbk').decode(encoding='latin-1')
    path1=path+title  
    localDir='E:\\ver\\fp\\'
    
    path2='abc/edf/'
    

    def __init__(self):
           
      try:
        f1.login('username','password')
      except ftplib.error_perm:
        print('f1 cannot loggin!')
        return

      try:
        f2.login()
      except ftplib.error_perm:
        print('f2 cannot loggin!')
        return
        
    def ftpD(self):
             
      filelist=[]
      fileLIST=[]
      filels=f1.retrlines('LIST %s'%(self.path1),callback=filelist.append)
      f1.cwd(self.path1)
      for file in filelist:
        fileAttr=file.split(' ')
        fileName=fileAttr[-1]
        fileType=fileAttr[0][0]
        if fileType=='-':
          fileLIST.append(fileName)
    
      for file in fileLIST:
        path=self.localDir+file
        f1.retrbinary('RETR %s'%(file),open(path,'wb').write)
        print('%s download.....'%(file))    
      f1.quit()
    
    def ftpU(self,fun=1):
    
      os.chdir(self.localDir)
      fileList=os.listdir()
      
      # upload file
      if fun==1:
          for file in fileList:
            path=self.path2
            f2.storbinary('STOR %s'%(path+file),open(file,'rb'))
            print('%s uploading......'%(file))
      
      #delete file
      if fun==0:
          try:
              for file in fileList:
                path=self.path2
                f2.delete(path+file)
                print('%s delete......'%(file))
          except ftplib.error_perm:
              print('no file to delete!!')
              return
      
      f2.quit()
    
    def test(self):
      
      f1.cwd(self.path1)
      f2.cwd(self.path2)
      fileList=f1.nlst()
      print(fileList)
      
      for file in fileList:
        print('transfer %s......'%(file))
        f1.voidcmd('TYPE I')
        f2.voidcmd('TYPE I')
        sock1=f1.transfercmd('RETR %s'%(file))
        sock2=f2.transfercmd('STOR %s'%(file))
    
        while 1:
      
            data=sock1.recv(1024)
            sock2.sendall(data)
            
            if len(data)==0:
              break
        # 数据发送完成后需关闭socket,服务器21端口才会有返回    
        sock1.close()
        sock2.close()
            
                          
        res1=f1.getresp()
        #print('f1 >> %s'%(res1))
        res2=f2.getresp()
        #print('f2 >> %s'%(res2))    
                   
      f1.quit()
      f2.quit()

    
if __name__=='__main__':
  ftptest=myFTP() 
  ftptest.ftpU(0)
  #ftptest.test()
  #ftptest.ftpD()
Python 相关文章推荐
python迭代器的使用方法实例
Nov 21 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
Python登录系统界面实现详解
Jun 25 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
Python传递参数的多种方式(小结)
Sep 18 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
Python装饰器用法与知识点小结
Mar 09 Python
python适合做数据挖掘吗
Jun 16 Python
如何基于python实现年会抽奖工具
Oct 20 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 #Python
Python异常处理例题整理
Jul 07 #Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 #Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 #Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 #Python
对Python中画图时候的线类型详解
Jul 07 #Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 #Python
You might like
PHP 判断变量类型实现代码
2009/10/23 PHP
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
python多线程扫描端口示例
2014/01/16 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
Python循环实现n的全排列功能
2019/09/16 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
Tostadora意大利:定制T恤
2019/04/08 全球购物
村捐赠仪式答谢词
2014/01/21 职场文书
小学生倡议书范文
2014/05/13 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
班主任先进事迹材料
2014/12/17 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
python调试工具Birdseye的使用教程
2021/05/25 Python
mysql自增长id用完了该怎么办
2022/02/12 MySQL
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫
一级电子管军用接收机测评
2022/04/05 无线电