基于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网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 Python
Python开发网站目录扫描器的实现
Feb 21 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
Python语法分析之字符串格式化
Jun 13 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
Mar 18 Python
Python turtle库的画笔控制说明
Jun 28 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 Python
关于Python使用turtle库画任意图的问题
Apr 01 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
MVC模式的PHP实现
2006/10/09 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
总裁办公室主任职责
2014/01/02 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
北京奥运会口号
2014/06/21 职场文书