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程序代码的几种方法总结
Apr 28 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
Python中的ConfigParser模块使用详解
May 04 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python实现朴素贝叶斯算法
Nov 19 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
通过实例解析Python return运行原理
Mar 04 Python
Django操作session 的方法
Mar 09 Python
增大python字体的方法步骤
Jul 05 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 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
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
PHP实现的简单日历类
2014/11/29 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
最短的IE判断代码
2011/03/13 Javascript
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
Python 元类使用说明
2009/12/18 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
python实现月食效果实例代码
2019/06/18 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
python实现自动打卡的示例代码
2020/10/10 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
2014自荐信的写作技巧
2014/01/28 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
暑期工社会实践报告
2015/07/13 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA