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生成pdf文件的方法
Aug 04 Python
跟老齐学Python之集合(set)
Sep 24 Python
Python中的Classes和Metaclasses详解
Apr 02 Python
python文件操作相关知识点总结整理
Feb 22 Python
Python字典及字典基本操作方法详解
Jan 30 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
Django命名URL和反向解析URL实现解析
Aug 09 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
Python新手学习标准库模块命名
May 29 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 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
phpMyAdmin 安装及问题总结
2009/05/28 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
php格式文件打开的四种方法
2018/02/24 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python实现日常记账本小程序
2018/03/10 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
Python适配器模式代码实现解析
2019/08/02 Python
python动态视频下载器的实现方法
2019/09/16 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
电子商务专业学生的自我鉴定
2013/11/28 职场文书
硕士研究生个人求职信
2013/12/04 职场文书
师德师风事迹材料
2014/12/20 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android