基于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 相关文章推荐
Android应用开发中Action bar编写的入门教程
Feb 26 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
python查询mysql,返回json的实例
Mar 26 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
对python中数组的del,remove,pop区别详解
Nov 07 Python
python的继承知识点总结
Dec 10 Python
python验证码图片处理(二值化)
Nov 01 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
Python使用graphviz画流程图过程解析
Mar 31 Python
详解Python的爬虫框架 Scrapy
Aug 03 Python
python绘制雷达图实例讲解
Jan 03 Python
python爬取2021猫眼票房字体加密实例
Feb 19 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
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
PHP strtr() 函数使用说明
2008/11/21 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
PHP _construct()函数讲解
2019/02/03 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
Python Paramiko模块的使用实际案例
2018/02/01 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
Python有参函数使用代码实例
2020/01/06 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
中学生爱国演讲稿
2014/09/05 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
初中班主任教育随笔
2015/08/15 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书