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脚本实现代码行数统计代码分享
Mar 10 Python
Python中 Lambda表达式全面解析
Nov 28 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
python使用Flask操作mysql实现登录功能
May 14 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
python实现websocket的客户端压力测试
Jun 25 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
python lambda函数及三个常用的高阶函数
Feb 05 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
Python-jenkins模块之folder相关操作介绍
May 12 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 Python
Python 中 Shutil 模块详情
Nov 11 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
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
PHP+JQuery+Ajax实现分页方法详解
2016/08/06 PHP
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
python在windows下实现备份程序实例
2014/07/04 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python 支付整合开发包的实现
2019/01/23 Python
Python测试模块doctest使用解析
2019/08/10 Python
django迁移文件migrations的实现
2020/03/31 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
《雨点儿》教学反思
2014/04/14 职场文书
项目建议书范文
2014/05/12 职场文书
导游词之桂林
2019/08/20 职场文书
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA
redis 解决库存并发问题实现数量控制
2022/04/08 Redis