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实现面向对像的ASP程序实例
Nov 10 Python
Python文件的读写和异常代码示例
Oct 31 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
Python实现ping指定IP的示例
Jun 04 Python
python实现C4.5决策树算法
Aug 29 Python
对python中类的继承与方法重写介绍
Jan 20 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
python多进程使用函数封装实例
May 02 Python
python实现PDF中表格转化为Excel的方法
Jun 16 Python
Python实现壁纸下载与轮换
Oct 19 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获取YouTube视频信息的方法
2015/02/11 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
分析Python中解析构建数据知识
2018/01/20 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
详解python pandas 分组统计的方法
2019/07/30 Python
python dumps和loads区别详解
2020/02/04 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
大学生职业生涯规划范文
2014/01/08 职场文书
小学捐书活动总结
2014/07/05 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
城管年度个人总结
2015/02/28 职场文书
机器人总动员观后感
2015/06/09 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
Python实现单例模式的5种方法
2021/06/15 Python