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 相关文章推荐
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
Python AES加密实例解析
Jan 18 Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 Python
django的model操作汇整详解
Jul 26 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
如何使用Python抓取网页tag操作
Feb 14 Python
Python实现验证码识别
Jun 15 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
python中upper是做什么用的
Jul 20 Python
Python xmltodict模块安装及代码实例
Oct 05 Python
python编写扎金花小程序的实例代码
Feb 23 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 cookie的操作实现代码(登录)
2010/12/29 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
Node.js 中使用 async 函数的方法
2017/11/20 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
Vue看了就会的8个小技巧
2021/01/21 Vue.js
Django接受前端数据的几种方法总结
2016/11/04 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
给幼儿园老师的表扬信
2014/01/19 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
公司内部升职自荐信
2015/03/27 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
nginx 添加http_stub_status_module模块
2022/05/25 Servers
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android