1. 程式人生 > >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
這裡寫圖片描述
還有
這裡寫圖片描述
最後上一下執行結果
這裡寫圖片描述