python实现下载整个ftp目录的方法


Posted in Python onJanuary 17, 2017

前言

最近因为业务需求,就写了这个脚本,脚本完成的任务是从FTP上下载一个目录,大家都知道从FTP上下载一个文件可用用get命令,下载多个文件可以用mget,但你要下载一个目录,对不起,不能,如果非要较劲,你说用lftp,然后用mirror命令也可以呀,这个我不较真,因为每个公司有每个公司的场景,选择合适的就行,因为我们这的FTP都是用ssl的,所以lftp就不能用了,脚本基本思路是建立ftp连接,然后登陆获取文件列表,根据返回的列表进行for循环,一个一个下载。

脚本如下:

#!/usr/bin/evn python
 
from ftplib import FTP_TLS, FTP
import socket
import ssl
import os
import sys
 
class IMPLICIT_FTP_TLS(FTP_TLS):
 #构造函数初始化父类
 def __init__(self, host='', user='', passwd='', acct='', keyfile=None,
  certfile=None, timeout=60):
  FTP_TLS.__init__(self, host, user, passwd, acct, keyfile, certfile, timeout)
 #建立服务器的FTPS连接
 def connect(self, host='', port=0, timeout=-999):
  if host != '':
   self.host = host
  if port > 0:
   self.port = port
  if timeout != -999:
   self.timeout = timeout
  try:
   #创建socket
   self.sock = socket.create_connection((self.host, self.port), self.timeout)
   self.af = self.sock.family
   #wrap_socket接收一个socket实例,返回SSLSocket实例,可以理解在普通socket上封装了一层ssl
   self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
   self.file = self.sock.makefile('rb')
   self.welcome = self.getresp()
  except Exception as e:
   print (e)
  return self.welcome
 
 
def get_ftp_ver(version):
 #如果没有这个目录就新建
 if not os.path.isdir(version):
  os.makedirs(version)
 ftps = IMPLICIT_FTP_TLS()
 ftps.connect(host='10.0.0.8', port=666)
 ftps.login(user="ftp_user", passwd="ftp_password")
 #建立安全的数据连接,之后才能返回数据。
 ftps.prot_p()
 ftps.cwd(version)
 files = ftps.nlst()
 #进入本地目录
 os.chdir(version)
 #循环下载每个文件
 for file in files:
  fp = open(file, 'wb')
  ftps.retrbinary('RETR %s' % file, fp.write)
 ftps.close()
 
if __name__ == '__main__':
 get_ftp_ver(sys.argv[1])

脚本使用:

#python get_data.py version_20160920

后面跟的参数基本就是研发提供给你要更新的文件名称,然后运行就可以下载整个目录中的文件,脚本其它内容大家看注释就会明白。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python字符串处理实例详解
May 18 Python
Python时间戳使用和相互转换详解
Dec 11 Python
Python删除n行后的其他行方法
Jan 28 Python
详解用Python实现自动化监控远程服务器
May 18 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
树莓派3 搭建 django 服务器的实例
Aug 29 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
Python单例模式的四种创建方式实例解析
Mar 04 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
Python实例教程之检索输出月份日历表
Dec 16 Python
Pillow图像处理库安装及使用
Apr 12 Python
ansible作为python模块库使用的方法实例
Jan 17 #Python
python 基础教程之Map使用方法
Jan 17 #Python
Python获取某一天是星期几的方法示例
Jan 17 #Python
Python正则表达式匹配中文用法示例
Jan 17 #Python
python下如何查询CS反恐精英的服务器信息
Jan 17 #Python
python基础教程之匿名函数lambda
Jan 17 #Python
python基础教程之Filter使用方法
Jan 17 #Python
You might like
PHP页面间传递参数实例代码
2008/06/05 PHP
PHP MSSQL 存储过程的方法
2008/12/24 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
详解在React-Native中持久化redux数据
2019/05/22 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
省级四好少年事迹材料
2014/01/25 职场文书
写求职信有什么意义
2014/02/17 职场文书
10的分与合教学反思
2014/04/30 职场文书
学习型班组申报材料
2014/05/31 职场文书
护林防火标语
2014/06/27 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
教师年度考核个人总结
2015/02/12 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
python实战之用emoji表情生成文字
2021/05/08 Python
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS