python实现从ftp上下载文件的实例方法


Posted in Python onJuly 19, 2020

python从ftp上下载文件的方法:

首先导入ftp模块;

然后使用【chdir】命令切换工作路径;

再使用“self.ftp.nlst()”命令获取目录下的文件;

最后使用“self.ftp.retrbinary()”命令下载ftp文件即可。

#!/usr/bin/python
# coding=utf-8
import os
from ftplib import FTP # 引入ftp模块
class MyFtp:
  ftp = FTP()  
  def __init__(self,host,port=21):
    self.ftp.connect(host,port)  
  def login(self,username,pwd):
    self.ftp.set_debuglevel(2) # 打开调试级别2,显示详细信息    
    self.ftp.login(username,pwd)    
    p
rint(self.ftp.welcome)  
  def downloadFile(self,localpath,remotepath,filename):
    os.chdir(localpath)  # 切换工作路径到下载目录
    self.ftp.cwd( remotepath)  # 要登录的ftp目录
    self.ftp.nlst() # 获取目录下的文件
    file_handle = open(filename,"wb").write  # 以写模式在本地打开文件
    self.ftp.retrbinary('RETR %s' % os.path.basename(filename),file_handle,blocksize=1024) # 下载ftp文件
    # ftp.delete(filename) # 删除ftp服务器上的文件
  def close(self):
    self.ftp.set_debuglevel(0) # 关闭调试    
    self.ftp.quit()if __name__ == '__main__':
  ftp = MyFtp('host')
  ftp.login('username','pwd')
  ftp.downloadFile('E:\\RED\\workspace\\appAuto\\apk\\Android10','/mobile/Android/release10/','xxx.apk')
  ftp.close()

实例扩展:

#coding=utf-8
'''
 ftp自动下载、自动上传脚本,可以递归目录操作
'''

from ftplib import FTP
import os,sys,string,datetime,time
import socket

class MYFTP:
 def __init__(self, hostaddr, username, password, remotedir, port=21):
 self.hostaddr = hostaddr
 self.username = username
 self.password = password
 self.remotedir = remotedir
 self.port = port
 self.ftp = FTP()
 self.file_list = []
 # self.ftp.set_debuglevel(2)
 def __del__(self):
 self.ftp.close()
 # self.ftp.set_debuglevel(0)
 def login(self):
 ftp = self.ftp
 try: 
 timeout = 300
 socket.setdefaulttimeout(timeout)
 ftp.set_pasv(True)
 print u'开始连接到 %s' %(self.hostaddr)
 ftp.connect(self.hostaddr, self.port)
 print u'成功连接到 %s' %(self.hostaddr)
 print u'开始登录到 %s' %(self.hostaddr)
 ftp.login(self.username, self.password)
 print u'成功登录到 %s' %(self.hostaddr)
 debug_print(ftp.getwelcome())
 except Exception:
 print u'连接或登录失败'
 try:
 ftp.cwd(self.remotedir)
 except(Exception):
 print u'切换目录失败'

 def is_same_size(self, localfile, remotefile):
 try:
 remotefile_size = self.ftp.size(remotefile)
 except:
 remotefile_size = -1
 try:
 localfile_size = os.path.getsize(localfile)
 except:
 localfile_size = -1
 debug_print('localfile_size:%d remotefile_size:%d' %(localfile_size, remotefile_size),)
 if remotefile_size == localfile_size:
 return 1
 else:
 return 0
 def download_file(self, localfile, remotefile):
 if self.is_same_size(localfile, remotefile):
 debug_print(u'%s 文件大小相同,无需下载' %localfile)
 return
 else:
 debug_print(u'>>>>>>>>>>>>下载文件 %s ... ...' %localfile)
 #return
 file_handler = open(localfile, 'wb')
 self.ftp.retrbinary(u'RETR %s'%(remotefile), file_handler.write)
 file_handler.close()

 def download_files(self, localdir='./', remotedir='./'):
 try:
 self.ftp.cwd(remotedir)
 except:
 debug_print(u'目录%s不存在,继续...' %remotedir)
 return
 if not os.path.isdir(localdir):
 os.makedirs(localdir)
 debug_print(u'切换至目录 %s' %self.ftp.pwd())
 self.file_list = []
 self.ftp.dir(self.get_file_list)
 remotenames = self.file_list
 #print(remotenames)
 #return
 for item in remotenames:
 filetype = item[0]
 filename = item[1]
 local = os.path.join(localdir, filename)
 if filetype == 'd':
 self.download_files(local, filename)
 elif filetype == '-':
 self.download_file(local, filename)
 self.ftp.cwd('..')
 debug_print(u'返回上层目录 %s' %self.ftp.pwd())
 def upload_file(self, localfile, remotefile):
 if not os.path.isfile(localfile):
 return
 if self.is_same_size(localfile, remotefile):
 debug_print(u'跳过[相等]: %s' %localfile)
 return
 file_handler = open(localfile, 'rb')
 self.ftp.storbinary('STOR %s' %remotefile, file_handler)
 file_handler.close()
 debug_print(u'已传送: %s' %localfile)
 def upload_files(self, localdir='./', remotedir = './'):
 if not os.path.isdir(localdir):
 return
 localnames = os.listdir(localdir)
 self.ftp.cwd(remotedir)
 for item in localnames:
 src = os.path.join(localdir, item)
 if os.path.isdir(src):
 try:
 self.ftp.mkd(item)
 except:
 debug_print(u'目录已存在 %s' %item)
 self.upload_files(src, item)
 else:
 self.upload_file(src, item)
 self.ftp.cwd('..')

 def get_file_list(self, line):
 ret_arr = []
 file_arr = self.get_filename(line)
 if file_arr[1] not in ['.', '..']:
 self.file_list.append(file_arr)
 
 def get_filename(self, line):
 pos = line.rfind(':')
 while(line[pos] != ' '):
 pos += 1
 while(line[pos] == ' '):
 pos += 1
 file_arr = [line[0], line[pos:]]
 return file_arr
def debug_print(s):
 print s

if __name__ == '__main__':
 timenow = time.localtime()
 datenow = time.strftime('%Y-%m-%d', timenow)
 # 配置如下变量
 hostaddr = '211.15.113.45' # ftp地址
 username = 'UserName' # 用户名
 password = '123456' # 密码
 port = 21 # 端口号 
 rootdir_local = 'E:/mypiv' # 本地目录
 rootdir_remote = '/PIV'  # 远程目录
 
 f = MYFTP(hostaddr, username, password, rootdir_remote, port)
 f.login()
 f.download_files(rootdir_local, rootdir_remote)
 
 timenow = time.localtime()
 datenow = time.strftime('%Y-%m-%d', timenow)
 logstr = u"%s 成功执行了备份n" %datenow
 debug_print(logstr)

到此这篇关于python实现从ftp上下载文件的实例方法的文章就介绍到这了,更多相关python怎么实现从ftp上下载文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python检测远程服务器tcp端口的方法
Mar 14 Python
Python类定义和类继承详解
May 08 Python
Python 专题二 条件语句和循环语句的基础知识
Mar 19 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
Python递归实现打印多重列表代码
Feb 27 Python
tensorflow之读取jpg图像长和宽实例
Jun 18 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
python生成xml时规定dtd实例方法
Sep 21 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 Python
python playwright之元素定位示例详解
Jul 23 Python
python中关于数据类型的学习笔记
Jul 19 #Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 #Python
用python给csv里的数据排序的具体代码
Jul 17 #Python
python如何删除列为空的行
Jul 17 #Python
Python操作Elasticsearch处理timeout超时
Jul 17 #Python
python设置表格边框的具体方法
Jul 17 #Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 #Python
You might like
Window下PHP三种运行方式图文详解
2013/06/11 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
详解vue express启动数据服务
2017/07/05 Javascript
react-native ListView下拉刷新上拉加载实现代码
2017/08/03 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
浅谈node的事件机制
2017/10/09 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
Vite和Vue CLI的优劣
2021/01/30 Vue.js
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
python使用循环实现批量创建文件夹示例
2014/03/25 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
Python基础之函数的定义与使用示例
2019/03/23 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
精伦电子Java笔试题
2013/01/16 面试题
毕业生自荐书
2014/02/02 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
Nginx 常用配置
2022/05/15 Servers