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通过正则表达式选取callback的方法
Jul 18 Python
Python set常用操作函数集锦
Nov 15 Python
Python3多线程操作简单示例
May 22 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
详解flask表单提交的两种方式
Jul 21 Python
python保存文件方法小结
Jul 27 Python
python交易记录链的实现过程详解
Jul 03 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
Python小白不正确的使用类变量实例
May 29 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
python 实现压缩和解压缩的示例
Sep 22 Python
anaconda升级sklearn版本的实现方法
Feb 22 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
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
功能强大的php文件上传类
2016/08/29 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
Python bytes string相互转换过程解析
2020/03/05 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
先进个人事迹材料
2014/01/25 职场文书
党员目标管理责任书
2014/07/25 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
技术入股合作协议书
2016/03/21 职场文书
Go语言基础map用法及示例详解
2021/11/17 Golang
Python面试不修改数组找出重复的数字
2022/05/20 Python