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 相关文章推荐
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
python使用xslt提取网页数据的方法
Feb 23 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
详解用python生成随机数的几种方法
Aug 04 Python
Python测试模块doctest使用解析
Aug 10 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
Python timeit模块原理及使用方法
Oct 10 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 Python
python办公自动化之excel的操作
May 23 Python
利用Pycharm连接服务器的全过程记录
Jul 01 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 Python
Python数据处理的三个实用技巧分享
Apr 01 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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
javascript some()函数用法详解
2014/11/13 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
菲律宾最大的网上花店和礼品店:PhilFlower.com
2018/02/09 全球购物
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
运动会加油稿100字
2014/09/19 职场文书
2015年安全生产责任书
2015/01/30 职场文书
大学生年度个人总结
2015/02/15 职场文书
Python编写冷笑话生成器
2022/04/20 Python