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

还有

最后上一下执行结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python创建文件夹与文件的快捷方法

    前言 Python快捷创建文件夹和文件详解 自己做文件时发现  简单的反复操作十分浪费时间,于是想到了 使用Python,这个分享给大家,快捷高效办公. 项目目录 file11 创建文件夹 file22 创建文件 1.创建文件夹 # 批量 创建文件夹 import os #倒入OS模块 创建文件夹 需要的 # 保存路径,直接从电脑文件夹中复制过来,但是 # 注意,直接复制过来的C:\English\LETS\雅思听力 路径结尾是没斜杠的. # 路径是需要 斜杠结尾的,否则 会以LETS为根目录,

  • Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】

    本文实例讲述了Python编程实现两个文件夹里文件的对比功能.分享给大家供大家参考,具体如下: #-*-coding:utf-8-*- #=============================================================================== # 目录对比工具(包含子目录 ),并列出 # 1.A比B多了哪些文件 # 2.B比A多了哪些文件 # 3.二者相同的文件:文件大小相同 VS 文件大小不同 (Size相同文件不打印:与Size不同文件显

  • Python文件夹与文件的相关操作(推荐)

    最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模块, 导入的方法是: import os 一.取得当前目录 s = os.getcwd() # s 中保存的是当前目录(即文件夹) 比如运行abc.py,那么输入该命令就会返回abc所在的文件夹位置. 举个简单例子,我们将abc.py放入A文件夹.并且希望不管将A文件夹放在硬盘的哪个位置,都可以在A

  • Python批量重命名同一文件夹下文件的方法

    本文实例讲述了Python批量重命名同一文件夹下文件的方法.分享给大家供大家参考.具体分析如下: 朋友发了一个文件夹过来,里面的图片都以 .tmp 为后缀. 手工修改的话工作量太大.故写了一个 Python 脚本进行批量重命名. 对 Python 的标准库不熟,只能边查资料,或者 help() 边写代码. 三行代码就可以解决这一问题. 不过没有捕获异常.不能迭代同一目录下的所有文件. 代码如下: import os for file in os.listdir("."): if os.

  • Python模糊查询本地文件夹去除文件后缀的实例(7行代码)

    7行代码实现的,废话不多说,直接上代码: import os,re def fuzzy_search(path): word= input('请输入要查询的内容:') for filename in os.listdir(path): #遍历指定文件夹 re_filename = re.findall('.\w+', str(filename)) #去除文件后缀名 if word in re_filename[0]: print(re_filename[0]) 以上这篇Python模糊查询本地文

  • Python遍历某目录下的所有文件夹与文件路径

    本文与<[Java]读取其下所有文件夹与文件的路径>(点击打开链接)为姊妹篇,主要讲述Python对于文件信息的读取操作. Python对于文件信息的读取操作,在其固有类os中. 下面以读取F盘下的所有文件夹作为例子说明这个问题: Python对于文件夹的遍历有两种写法,一种是直接利用其封装好的walk方法直接操作. 这是Python做得比Java优势的地方: # -*-coding:utf-8-*- import os for root,dirs,files in os.walk("

  • Python实现删除时保留特定文件夹和文件的示例

    实现功能:删除当前目录下,除保留目录和文件外的所有文件和目录 #!bin/env python import os import os.path import shutil def DeleteFiles(path, remainDirsList, filesList): dirsList = [] dirsList = os.listdir(path) for f in dirsList: if f not in remainDirsList: filePath = os.path.join(

  • 解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题

    1. os.listdir()概述 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表. 例如: dir ='F:/Home_01/img'#当前目录 filenames=os.listdir(dir)#filenames存储dir下的所有文件名. 注意:os.listdir()返回的文件名不一定是顺序的,也就是说结果是不固定的,如下图,则filenames[0]有可能为'22.jpg',而不是我们所希望的'11.jpg'. 解决办法: filenames=os.l

  • python实现遍历文件夹修改文件后缀

    本文实例为大家分享了python实现遍历文件夹修改文件后缀的具体代码,供大家参考,具体内容如下 用法 python Modifer.py ./ -fp java xml # coding:utf-8 # Build by LandGrey 2016-05-27 import os import sys #批量修改路径与文件名 def Modifyprefix(Path,oldcontent,newcontent): all_file_list = os.listdir(Path) #列出指定目录

  • linux 下python多线程递归复制文件夹及文件夹中的文件

    本文是利用python 复制文件夹 刚开始写了一个普通的递归复制文件夹    然后想了想 觉得对io频繁的程序 threading 线程还比较友好  就写了个多线程版本的  最恶心人的地方就是路径  其他都还好吧 import os import threading import multiprocessing length_of_folder = 0 def copyfile(Path): if os.path.isdir(Path): print("-----------%s" %

随机推荐