python -SFTP
#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].dataToPath = 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 上传。