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中的__init__和__new__
Mar 12 Python
简单的Python的curses库使用教程
Apr 11 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
Django给admin添加Action的步骤详解
May 01 Python
Python获取时间戳代码实例
Sep 24 Python
Python字符串格式化输出代码实例
Nov 22 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
python对execl 处理操作代码
Jun 22 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 Python
python opencv通过4坐标剪裁图片
Jun 05 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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
PHP以及MYSQL日期比较方法
2012/11/29 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
eclipse php wamp配置教程
2016/06/30 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
动态调用CSS文件的JS代码
2010/07/29 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
Python实现手绘图效果实例分享
2020/07/22 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
追悼会子女答谢词
2014/01/28 职场文书
公休请假条
2014/04/11 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
篮球拉拉队口号
2015/12/25 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
python3 hdf5文件 遍历代码
2021/05/19 Python
Pandas数据类型之category的用法
2021/06/28 Python
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
mysql数据库实现设置字段长度
2022/06/10 MySQL