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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
python回调函数中使用多线程的方法
Dec 25 Python
在Python中输入一个以空格为间隔的数组方法
Nov 13 Python
python 用下标截取字符串的实例
Dec 25 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
python控制nao机器人身体动作实例详解
Apr 29 Python
python return逻辑判断表达式实现解析
Dec 02 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
python中selenium库的基本使用详解
Jul 31 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 时间计算问题小结
2009/01/04 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
javascript实现画板功能
2020/04/12 Javascript
vuex的使用步骤
2021/01/06 Vue.js
简单介绍Python中的decode()方法的使用
2015/05/18 Python
Python使用wxPython实现计算器
2018/01/30 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
捐赠仪式主持词
2014/03/19 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
研究生个人学年总结
2015/02/14 职场文书
通用员工手册范本
2015/05/14 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏