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中列表元素连接方法join用法实例
Apr 07 Python
Python基础知识_浅谈用户交互
May 31 Python
Python实现pdf文档转txt的方法示例
Jan 19 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
Python中fnmatch模块的使用详情
Nov 30 Python
python向字符串中添加元素的实例方法
Jun 28 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
python实现进度条的多种实现
Apr 29 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 清除网页病毒的方法
2008/12/05 PHP
php adodb操作mysql数据库
2009/03/19 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
php下连接mssql2005的代码
2011/01/17 PHP
php两种无限分类方法实例
2015/04/21 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
对python周期性定时器的示例详解
2019/02/19 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
python属于跨平台语言码
2020/06/09 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
python MD5加密的示例
2020/10/19 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
机电工程专业应届生求职信
2013/10/03 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
房产继承公证书
2014/04/09 职场文书
任命书模板
2014/06/04 职场文书
归元寺导游词
2015/02/06 职场文书