基于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 相关文章推荐
Linux下使用python自动修改本机网关代码分享
May 21 Python
python删除过期文件的方法
May 29 Python
python3.6数独问题的解决
Jan 21 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
python中bytes和str类型的区别
Oct 21 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 Python
python 写函数在一定条件下需要调用自身时的写法说明
Jun 01 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 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
漂亮但不安全的CTB
2006/10/09 PHP
第九节--绑定
2006/11/16 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
jquery 日期分离成年月日的代码
2010/05/14 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
解决Mac下使用python的坑
2019/08/13 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
银行门卫岗位职责
2013/12/29 职场文书
竞聘书模板
2014/03/31 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
2014年纪检工作总结
2014/11/12 职场文书
地陪导游欢迎词
2015/01/26 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
商务代表岗位职责
2015/02/15 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers
Pygame Event事件模块的详细示例
2021/11/17 Python