Python的sftp實現傳資料夾和檔案
阿新 • • 發佈:2019-01-27
利用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
還有
最後上一下執行結果