Python使用sftp实现传文件夹和文件
作者:白天丶 发布时间:2021-09-30 12:27:37
标签:python,sftp传文件夹,python,sftp传文件
利用python的sftp实现文件上传,可以是文件,也可以是文件夹。
版本Python2.7.13 应该不用pip安装更多的插件,都是自带的
不多说 上代码
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import paramiko
import os
_XFER_FILE = 'FILE'
_XFER_DIR = 'DIR'
class MainWindow(object):
# 构造方法
def __init__(self, arg):
# 超类调用
super(MainWindow, self).__init__()
# 赋值参数[字典]
# 参数格式 arg = {'ip':'填ip','user':'用户名','password':'密码','port':22}
self.arg = arg
# 赋值参数[FTP]
self.sftp = None
# 调试日志
print self.arg
# 启动程序
def startup(self):
# 连接FTP
if self.sftp != None:
print u'您已经成功连接了'
tmpstr = u'开始连接...用户名:'+self.arg['user']+u' 密码:'+self.arg['password']+' IP:'+self.arg['ip']+u' 端口:'+str(self.arg['port'])
print tmpstr
try:
transport = paramiko.Transport((self.arg['ip'], self.arg['port']))
transport.connect(username=self.arg['user'], password=self.arg['password'])
self.sftp = paramiko.SFTPClient.from_transport(transport)
print (u'连接成功 '+self.arg['ip'])
except Exception as e:
print u'连接失败:'+str(e)
# 关闭程序
def shutdown(self):
# 关闭FTP
if self.sftp:
self.sftp.close()
print '### disconnect sftp server: %s!'%self.arg['ip']
self.sftp = None
# 处理上传
def upload(self, source, target, replace):
### 操作数据
# 来源路径
source = source.replace('\\', '/')
# 目标路径
target = target.replace('\\', '/')
### 验证数据
if not os.path.exists(source):
print u'来源资源不存在,请检查:' + source
return
### 格式数据
# 格式化目标路径
self.__makePath(target)
### 处理数据
# 文件媒体数据(文件类型, 文件名称)
filetype, filename = self.__filetype(source)
# 判断文件类型
if filetype == _XFER_DIR:
# 1.目录
self.uploadDir(source, target, replace)
elif filetype == _XFER_FILE:
# 2.文件
self.uploadFile(source, filename, replace)
# 传送目录
def uploadDir(self, source, target, replace):
### 验证数据
# 判断目录存在
if not os.path.isdir(source):
print u'这个函数是用来传送本地目录的'
return
### 处理数据
# 遍历目录内容,上传资源
for file in os.listdir(source):
# 资源路径
filepath = os.path.join(source, file)
# 判断资源文件类型
if os.path.isfile(filepath):
# 1.文件
self.uploadFile(filepath, file, replace)
elif os.path.isdir(filepath):
# 2.目录
try:
self.sftp.chdir(file)
except:
self.sftp.mkdir(file)
self.sftp.chdir(file)
self.uploadDir(filepath, file, replace)
### 重置数据
# 返回上一层目录
self.sftp.chdir('..')
# 传送文件
def uploadFile(self, filepath, filename, replace):
### 验证数据
# 验证文件类型
if not os.path.isfile(filepath):
print u'这个函数是用来传送单个文件的'
return
# 验证文件存在
if not os.path.exists(filepath):
print u'err:本地文件不存在,检查一下'+filepath
return
# 验证FTP已连接
if self.sftp == None:
print u'sftp 还未链接'
return
### 处理数据
# 判断文件存在是否覆盖
if not replace:
if filename in self.sftp.listdir():
print u'[*] 这个文件已经存在了,选择跳过:' + filepath + ' -> ' + self.sftp.getcwd() + '/' + filename
return
# 上传文件
try:
self.sftp.put(filepath, filename)
print u'[+] 上传成功:' + filepath + ' -> ' + self.sftp.getcwd() + '/' + filename
except Exception as e:
print u'[+] 上传失败:' + filepath + ' because ' + str(e)
# 获得文件媒体数据({文件/目录, 文件名称})
def __filetype(self, source):
# 判断文件类型
if os.path.isfile(source):
# 1.文件
index = source.rfind('/')
return _XFER_FILE, source[index+1:]
elif os.path.isdir(source):
# 2.目录
return _XFER_DIR, ''
# 创建目标路径
# 说明: 目标路径不存在则依次创建路径目录
def __makePath(self, target):
# 切换根目录
self.sftp.chdir('/')
# 分割目标目录为目录单元集合
data = target.split('/')
# 进入目标目录, 目录不存在则创建
for item in data:
try:
self.sftp.chdir(item)
print u'要上传的目录已经存在,选择性进入合并:' + item
except:
self.sftp.mkdir(item)
self.sftp.chdir(item)
print u'要上传的目录不存在,创建目录:' + item
if __name__ == '__main__':
# """
# 先熟悉一下sftp有哪些用法 sftp.listdir(可以传参可以为空) 返回当前目录下清单列表
# mkdir 创建目录对应rmdir sftp.put(本地路径,远程要存的文件名) chdir进入子目录
# """
arg = {'ip':'填ip','user':'填用户名','password':'填密码','port':22}
me = MainWindow(arg)
me.startup()
# 要上传的本地文件夹路径
source = r'E:\xampp\backup\mysql\cto'
# 上传到哪里 [远程目录]
target = r'/home/www/cto/wp-superdo/backup/db'
replace = False
me.upload(source, target, replace)
me.shutdown()
def main(source, target, replace=False):
arg = {'ip':填ip,'user':填用户名,'password':填密码,'port':22}
me = MainWindow(arg)
me.startup()
me.upload(source, target, replace)
me.shutdown()
因为Python2.7对中文的支持不是很好所以如果出现中文错误
修改一下 Python27\Lib\site-packages\paramiko\py3compat.py
还有
最后上一下执行结果
来源:https://blog.csdn.net/qq_15682489/article/details/72400055
0
投稿
猜你喜欢
- Oblog4.6 ACCESS版转换为UCenterHome1.5的全过程1、 说明:
- 前言由与上不了学,教我们Mastercam的老师提前给我们布置了4道习题。对我们太好了,谢谢老师�没办法,干就完了。只是要求附上制作过程视频
- 如何让页面超时并指定一个超时时间?下面就是利用缓冲的程序页面事例: <%@ OutputCache Du
- 整个安装流程如下: 1,首先安装apache:我安装的版本是: httpd-2.2.16-win32-x86-openssl-0.9.8o.
- 一、前言在学习深度学习会发现都比较爱用python这个argparse,虽然基本能理解,但没有仔细自己动手去写,因此这里写下来作为自己本人的
- 前言 一直用ASP+ACCESS来编写网页和公司的内部应用系统,内部应用系统也就是大家说的OA吧,这个我也不知道,公司又叫它ERP,反正不管
- 首先感谢比尔、感谢微软、感谢MSDN,是他们让我看到他们富有创意的一面,好了好了不废话了。我们经常把多个CSS或者多个JS并成一个,以节省请
- 最近学习python并发,于是对多进程、多线程、异步和协程做了个总结。一、多线程多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处
- 1.分析 我们在用 php 制作网站时,分类是很重要的,在分类下面又再分类这第二个分类称为次分类,而现在大多
- 良好的编程习惯是每个程序员都应该具备的工作素质,在我的软件生涯中屡屡发现一些程序员的身上总有这样或者那样的坏毛病。这些毛病在一些从业时间不是
- 一、什么是字典树在自然语言处理中,字符串集合常用字典树存储,这是一种字符串上的树形数据结构。字典树中每条边都对应一个字,从根节点往下的路径构
- 本文实例讲述了Python使用scrapy采集数据过程中放回下载过大页面的方法。分享给大家供大家参考。具体分析如下:添加以下代码到setti
- 本文实例总结了php遍历目录方法。分享给大家供大家参考。具体如下:1. 方法1 <?p
- 代码如下: function astro(birth) astro="" if birth=""
- 让你的读者能够方便地收藏你的文章到社会化书签(网摘)网站,如 新浪,google,yahoo,Del.icio.us, 365key等添加到
- 这几天忙个合作,开发iPhone版校友录。用了很久的iPhone,为它量身定制一套页面还是头一次,好在限制不是很多,会写html基本呈现就不
- 本文实例讲述了Python实现的简单计算器功能。分享给大家供大家参考,具体如下:使用python编写一款简易的计算器计算器效果图首先搭建计算
- 目录项目地址:1) 启动方法2) web查看方法3) 功能说明:4) 展示:代码项目地址:https://github.com/guodon
- 首先介绍下比较简单但必不可少且实用的知识,可以当手册查询,适合像我一样的新手看。PHP常用库函数介绍一、PHP字符串操作常用函数1.确定字符
- Microsoft? SQL Server? 2000 的可用版本如下:SQL Server 2000企业版作为生产数据库服务器使用。支持