#coding=utf-8
'''
Created on Jun 6, 2017@author: wb
'''
import wx
import os
import shutil
import sys
import os.path
import paramiko
from paramiko import sftp
import time
import WtgGetCfg
from WtgGetCfg import getCfg
from WtgGetCfg import saveCfgdef main():
? ? global path
? ? global rootdir? # 指明被遍歷的文件夾
? ? global ToPath
? ? global host
? ? global user
? ? global passwd
? ? global mtime
#? ? ? time.strftime('%Y_%m',time.localtime(time.time()))
? ? txtName = time.strftime('%Y_%m',time.localtime(time.time()))
? ? f = file(txtName, "a+")
#? ? history = f.read()
? ? f.close()
? ?
? ? print txtName
? ?
? ? host,rootdir,user,passwd,lastTime,ToPath = getCfg()
? ?
? ? if not os.path.isdir(ToPath):
? ? ? ? os.makedirs(ToPath)
? ? ? ? print 'New Floder Successful'? ? mtime = lastTime
? ? historyTime = time.strptime(lastTime,"%a %b %d %H:%M:%S %Y")? ? print time.mktime(historyTime)
? ? print host,rootdir,user,passwd,lastTime,ToPath
? ? try:
? ? ? ? t = paramiko.Transport((host,22))
? ? ? ? t.connect(username=user, password=passwd)
? ? ? ? sftp = paramiko.SFTPClient.from_transport(t)
? ? except:
? ? ? ? print "connection failed "
? ? ? ? f2 = open(txtName, "a")
? ? ? ? name = "connection failed"+"\t"+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+"\n"
? ? ? ? f2.write(name)
? ? ? ? f2.close()
#? ? ? ? app = wx.PySimpleApp()
? ? ? ? app = wx.App()
? ? ? ? dlg = wx.MessageDialog(None, 'connection failed'+"\n"+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 'Warning !',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? wx.OK | wx.ICON_INFORMATION
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? dlg.ShowModal()
? ? ? ? dlg.Destroy()
? ? ? ? return -1? ?? ?
? ? for parent,dirnames,filenames in os.walk(u''+rootdir.encode('gbk')):? ? #三個參數:分別返回1.父目錄 2.所有文件夾名字(不含路徑) 3.所有文件名字
? ? ? ? f1 = open(txtName, "a")
? ? ? ? for filename in filenames:? ? ? ? ? ? ? ? ? ? ? ? #輸出文件信息
#? ? ? ? print "parent is:" + parent
#? ? ? ? print "filename is:" + filename
#? ? ? ? print "the full name of the file is:" + os.path.join(parent,filename) #輸出文件路徑信息
? ? ? ? ? ? mtime = time.ctime(os.path.getmtime(os.path.join(parent,filename)))
? ? ? ? ? ? print mtime
? ? ? ?
? ? ? ? ? ? nowTime = time.strptime(mtime,"%a %b %d %H:%M:%S %Y")
? ? ? ? ? ? print time.mktime(nowTime)
? ? ? ? ? ? if nowTime > historyTime :
? ? ? ? ? ? ? ? print filename
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? if sftp.put(os.path.join(parent,filename),filename):
? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? shutil.copy (os.path.join(parent,filename), ToPath)
? ? ? ? ? ? ? ? ? ? os.remove (os.path.join(parent,filename))
? ? ? ? ? ? ? ? ? ? print 'success'
? ? ? ? ? ? ? ? ? ? name = filename +"\t"+"ok"+"\t"+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+"\n"
? ? ? ? ? ? ? ? ? ? f1.write(name)
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? app = wx.App()
? ? ? ? ? ? ? ? ? ? dlg = wx.MessageDialog(None, filename+'upload failed',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 'Warning !',
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? wx.OK | wx.ICON_INFORMATION
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? dlg.ShowModal()
? ? ? ? ? ? ? ? ? ? dlg.Destroy()
? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? print 'be defeated'
? ? ? ? ? ? ? ? ? ? print filename
? ? ? ? ? ? ? ? ? ? name = filename +"\t"+"fail"+"\t"+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+"\n"
? ? ? ? ? ? ? ? ? ? f1.write(name)
? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?
? ? ?
#? ? ? ? if filename in history:
? ? ? ? ? ?
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print '已經上傳過'
#? ? ? ? ?
? ? saveCfg(mtime)
? ? f1.close()
if __name__ == '__main__':
? ? main()
? ? ? ? ?
先上代碼蜻展,以上是SFTP上傳的 Python代碼。
這個段代碼配有一個XML文件的配置文件(必須和運行程序在同一目錄下)
文件名uploader.xml
<data>
? <app>
? <IP>192.168.1.100</IP>
? <path>C:/Users/Desktop/new</path>
? <user>test</user>
? <password>11</password><lastTime>Mon Dec 05 17:59:32 2016</lastTime>
? <ToPath>C:/Desktop/opc/new2</ToPath></app>
</data>
有配置文件必須要配帶有 操作文件的 代碼:
#!/usr/bin/python
#coding=utf-8?
from xml.dom.minidom import parse
import xml.dom.minidom
import osglobal xmlFile
xmlFile = "\\uploader.xml"global folder
global IP_Addr
global total_cycle
def getCfg():
? ? global appDir
? ? global xmlFile
? ? appDir = os.getcwd()
? ? xmlFile = appDir + xmlFile
? ? if? (os.path.exists(xmlFile))? :
? ? ? ? DOMTree = xml.dom.minidom.parse(xmlFile)
? ? ? ? Data = DOMTree.documentElement
? ? ? ? Apps = Data.getElementsByTagName("app")
? ? ? ? for app in Apps:?
? ? ? ? ? ? if app.hasAttribute("folder"):
? ? ? ? ? ? ? ? print "foldername: %s" % app.getAttribute("folder")? ? ?
#? ? ? ?
? ? ? ? ? ? ip = app.getElementsByTagName('IP')[0]
? ? ? ? ? ? #print "total_wtg: %s" % total_wtg.childNodes[0].data? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ? user = app.getElementsByTagName('user')[0]
? ? ? ? ? ?
? ? ? ? ? ? password = app.getElementsByTagName('password')[0]
? ? ? ? ? ?
? ? ? ? ? ? lastTime = app.getElementsByTagName('lastTime')[0]
? ? ? ? ? ? #print "server_option: %s" % server_option.childNodes[0].data? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ? path = app.getElementsByTagName('path')[0]
#? ? ? ? ? ? print "wf_name: %s" % wf_name.childNodes[0].data? ? ? ? ? ? ToPath = app.getElementsByTagName('ToPath')[0]
? ? ? ? ? ?
? ?
? ? ? ? return? ip.childNodes[0].data,? \
? ? ? ? path.childNodes[0].data,user.childNodes[0].data,password.childNodes[0].data,lastTime.childNodes[0].data,\
? ? ? ? ToPath.childNodes[0].data
? ? ?def saveCfg(time):
? ? global xmlFile
? ? DOMTree = xml.dom.minidom.parse(xmlFile)
? ? Data = DOMTree.documentElement
? ? Apps = Data.getElementsByTagName("app")
? ? for app in Apps:?
? ? ? ? if app.hasAttribute("folder"):
? ? ? ? ? ? print "foldername: %s" % app.getAttribute("folder")
? ? ?
? ? ? ? lastTime= app.getElementsByTagName('lastTime')[0]
? ? ? ? print "folder: %s" % lastTime.childNodes[0].data
? ? ? ? # folder
? ? ? ? lastTime.childNodes[0].data = time
? ? ? ?
? ? ? ?
? ? ? ? f = file(xmlFile, "w")
? ? ? ? Data.writexml(f)
? ? ? ? f.close()? ? ? ?
? ? return True
? ?
這樣的話就可以實現相對比較靈活點的? SFTP 上傳。