基于python实现FTP文件上传与下载操作(ftp&sftp协议)


Posted in Python onApril 01, 2020

前言 FTP(File Transfer Protocol)是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,访问服务器上的大量程序和信息。如果用户需要将文件从自己的计算机上发送到另一台计算机上,可使用FTP上传(upload)或(put)操作,而更多种的情况是用户使用FTP下载(download)或获取(get)操作从FTP服务器上下载文件
在传输文件时我们可能会选择sftp和ftp两种协议中的一种,两者的主要区别在于安全与传输速度,FTP传输数据的过程,他们在不同协议下的默认端口号是不同的,它有两种传输模式:主动传输模式(PORT)和被动传输模式(PASSIVE,简称PASV),关于FTP相关内容这里就不做详细数明了,这里将以python语言实现其功能

一 、基于ftp协议

Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函数列举如下

ftp登陆连接

from ftplib import FTP #加载ftp模块
ftp=FTP() #设置变量
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect(“IP”,“port”) #连接的ftp sever和端口
ftp.login(“user”,“password”) #连接的用户名,密码
print ftp.getwelcome() #打印出欢迎信息
ftp.cmd(“xxx/xxx”) #进入远程目录
bufsize=1024 #设置的缓冲区大小
filename=“filename.txt” #需要下载的文件
file_handle=open(filename,“wb”).write #以写模式在本地打开文件
ftp.retrbinaly(“RETR filename.txt”,file_handle,bufsize) #接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit() #退出ftp

ftp相关命令操作

ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.dir() #显示目录下所有目录信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建远程目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(fromname, toname)#将fromname修改名称为toname。
ftp.storbinaly(“STOR filename.txt”,file_handel,bufsize) #上传目标文件
ftp.retrbinary(“RETR filename.txt”,file_handel,bufsize) #下载FTP文件

#!/usr/bin/env python
#coding:utf-8

from ctypes import *
import os
import sys
import ftplib
import time

today = time.strftime('%Y%m%d',time.localtime(time.time()))
ip = '111.111.111.6'
username = 'ftpUserName' 
password = 'ftpPassWord'
filename = '203200189'+ today + 'A001.tar.gz'
src_file = '/ftpFilePath/'+filename

class myFtp:
 ftp = ftplib.FTP()
 ftp.set_pasv(False) 
 def __init__(self, host, port=21):
 self.ftp.connect(host, port)
 
 def Login(self, user, passwd):
 self.ftp.login(user, passwd)
 print(self.ftp.welcome)
 
 def DownLoadFile(self, LocalFile, RemoteFile): #下载指定目录下的指定文件
 file_handler = open(LocalFile, 'wb')
 print(file_handler)
 # self.ftp.retrbinary("RETR %s" % (RemoteFile), file_handler.write)#接收服务器上文件并写入本地文件
 self.ftp.retrbinary('RETR ' + RemoteFile, file_handler.write)
 file_handler.close()
 return True

 def DownLoadFileTree(self, LocalDir, RemoteDir): # 下载整个目录下的文件
 print("remoteDir:", RemoteDir)
 if not os.path.exists(LocalDir):
 os.makedirs(LocalDir)
 self.ftp.cwd(RemoteDir)
 RemoteNames = self.ftp.nlst()
 print("RemoteNames", RemoteNames)
 for file in RemoteNames:
 Local = os.path.join(LocalDir, file)
 print(self.ftp.nlst(file))
 if file.find(".") == -1:
 if not os.path.exists(Local):
  os.makedirs(Local)
 self.DownLoadFileTree(Local, file)
 else:
 self.DownLoadFile(Local, file)
 self.ftp.cwd("..")
 return True

 #从本地上传文件到ftp
 def uploadfile(self, remotepath, localpath):
 bufsize = 1024
 fp = open(localpath, 'rb')
 ftp.storbinary('STOR ' + remotepath, fp, bufsize)
 ftp.set_debuglevel(0)
 fp.close() 

 def close(self):
 self.ftp.quit()

if __name__ == "__main__":
 ftp = myFtp(ip)
 ftp.Login(username, password)
 ftp.DownLoadFile(filename,src_file )
 #ftp.DownLoadFileTree('.', '/cteidate/')

 ftp.close()
 print("ok!")

二 、基于sftp协议

在Python中可以使用paramiko模块中的sftp登陆远程主机,实现上传和下载功能。

#!/usr/bin/python
# coding=utf-8

import paramiko
import os

def sftp_upload(host,port,username,password,local,remote):
 sf = paramiko.Transport((host,port))
 sf.connect(username = username,password = password)
 sftp = paramiko.SFTPClient.from_transport(sf)
 try:
 if os.path.isdir(local):#判断本地参数是目录还是文件
 for f in os.listdir(local):#遍历本地目录
 sftp.put(os.path.join(local+f),os.path.join(remote+f))#上传目录中的文件
 else:
 sftp.put(local,remote)#上传文件
 except Exception,e:
 print('upload exception:',e)
 sf.close()

def sftp_download(host,port,username,password,local,remote):
 sf = paramiko.Transport((host,port))
 sf.connect(username = username,password = password)
 sftp = paramiko.SFTPClient.from_transport(sf)
 try:
 if os.path.isdir(local):#判断本地参数是目录还是文件
 for f in sftp.listdir(remote):#遍历远程目录
  sftp.get(os.path.join(remote+f),os.path.join(local+f))#下载目录中文件
 else:
 sftp.get(remote,local)#下载文件
 except Exception,e:
 print('download exception:',e)
 sf.close()

if __name__ == '__main__':
 host = '111.111.1111.2'#主机
 port = 22 #端口
 username = 'root' #用户名
 password = '123456' #密码
 local = '/sftptest/'#本地文件或目录,与远程一致,若当前为windows目录格式,window目录中间需要使用双斜线
 remote = '/opt/test/'#远程文件或目录,与本地一致,当前为linux目录格式
 sftp_upload(host,port,username,password,local,remote)#上传
 #sftp_download(host,port,username,password,local,remote)#下载

总结:

在python中这两种协议实现文件的上传与下载需要引入不同的模块,实现起来还是比较简单的,相关模块里的源码也是比较清晰。因为我需要的是每天定时下载文件,所以是在linux配置的定时每天早晨6点执行该python脚本的任务,所以文件名都是用日期命名的。
TP.quit()与FTP.close()的区别
FTP.quit():发送QUIT命令给服务器并关闭掉连接。这是一个比较“缓和”的关闭连接方式,但是如果服务器对QUIT命令返回错误时,会抛出异常。
FTP.close():单方面的关闭掉连接,不应该用在已经关闭的连接之后,例如不应用在FTP.quit()之后。

到此这篇关于基于python实现FTP文件上传与下载操作(ftp&sftp协议)的文章就介绍到这了,更多相关python 实现ftp文件上传下载内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python写xml文件的操作实例
Oct 05 Python
详解Python中find()方法的使用
May 18 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
发布你的Python模块详解
Sep 15 Python
详解python3实现的web端json通信协议
Dec 29 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
python自动12306抢票软件实现代码
Feb 24 Python
对pandas中Series的map函数详解
Jul 25 Python
解决python opencv无法显示图片的问题
Oct 28 Python
python实现kmp算法的实例代码
Apr 03 Python
Python依赖包迁移到断网环境操作
Jul 13 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 #Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 #Python
详解Python中pyautogui库的最全使用方法
Apr 01 #Python
django的模型类管理器——数据库操作的封装详解
Apr 01 #Python
opencv中图像叠加/图像融合/按位操作的实现
Apr 01 #Python
Django数据库操作之save与update的使用
Apr 01 #Python
django model通过字典更新数据实例
Apr 01 #Python
You might like
linux php mysql数据库备份实现代码
2009/03/10 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
python批量修改文件名的实现代码
2014/09/01 Python
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
奖学金自我鉴定范文
2013/10/03 职场文书
护士自我鉴定范文
2013/10/06 职场文书
记帐员岗位责任制
2014/02/08 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
初中中等生评语
2014/12/29 职场文书
关于召开会议的通知
2015/04/15 职场文书
欠条格式范本
2015/07/03 职场文书
2019年工作总结范文
2019/05/21 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis