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 30 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
TensorFlow模型保存/载入的两种方法
Mar 08 Python
python实现彩票系统
Jun 28 Python
Win10下python 2.7.13 安装配置方法图文教程
Sep 18 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
Python文件名匹配与文件复制的实现
Dec 11 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
PHP学习之数组的定义和填充
2011/04/17 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
Pytorch之保存读取模型实例
2019/12/30 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
Lookfantastic俄罗斯:欧洲在线化妆品零售商
2019/08/06 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
个人培训自我鉴定
2014/03/28 职场文书
市场营销计划书范文
2015/01/16 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS