[ 本帖最后由 basfan 于 2020-3-14 17:58 编辑 ]\n\n单位系统的数据库每天都会自动备份到本地
处于安全考虑,每天需要将本地数据库异地备份(备份拷贝到U盘或者网络)
因为每次手工去执行拷贝太麻烦了,所以我自己用python自己写了一个程序,让它替我执行。服务器端用的是ServU
程序目的是读取本地目录下特定文件夹中的文件对比ftp中文件,不一样的自动上传到服务器,配合计划任务,每天半夜3点执行一遍。
第一次发帖,不知道发的是否标准,阅读起来可能有点不习惯,见谅!
该程序在最新的python3.8.0中测试成功,但存在几个问题:
1、中文乱码问题,这个问题我更换了好几种编码,想适应serv-u的编码,发现不管用啥编码,都乱码。。
如果用我自己写的ftp服务器端倒是没有问题了,但在windows下用资源管理器查看变成了乱码。我也无语了,又因为根本用不到中文,索性没管它
2、只针对文件,因为我备份目录里面纯文件,也没有任何中文,所以是没问题的,ftp服务器是本地的,我自己开了一个账户,只用来备份到根目录,所以运行没错误。
3、最后备份成功的提示如果不去掉,做不到静默备份,我用的版本里面已经去掉了最后一行弹出对话框,可以做到静默备份到ftp
如果有人有修改版本或者更好用的,麻烦给我一份,谢谢!
我是初学python的小白,代码有不高效或者别扭的地方请见谅!
直接上代码:
[Python] 纯文本查看 复制代码
import os,ftplib,configparser
def listdiff(ftpfile,locallist):
for each1 in ftpfile:
for each2 in locallist:
if each2==each1:
locallist.remove(each2)
return locallist
def loadconfig(cffile,section,key):
if os.path.isfile(cffile):
cf=configparser.ConfigParser ()
cf.read(cffile)
return cf.get(section,key)
else:
return 0
def saveconfig(file,host,port,username,password):
cf=configparser.ConfigParser ()
cf['ftp']={'host':host,
'port':port,
'username':username,
'password':password}
with open(file,'w') as f:
cf.write(f)
def ftpconnect():
ftp=ftplib.FTP()
host=loadconfig(cfile,'ftp','host')
port=int(loadconfig(cfile,'ftp','port'))
username=loadconfig(cfile,'ftp','username')
password=loadconfig(cfile,'ftp','password')
ftp.connect(host,port)
ftp.login(username,password)
return ftp
def uploadfile(ftp,remotepath,localfile):
bufsize=2048
fp=open(localfile,'rb')
ftp.storbinary('STOR '+ remotepath,fp,bufsize)
ftp.set_debuglevel(0)
fp.close()
if __name__ == '__main__':
cfile='config.txt'
path=r'E:\haier'
uplist=[]
localfile=os.listdir(path)
ftp=ftpconnect()
ftpfile=ftp.nlst()
uplist=listdiff(ftpfile,localfile)
if os.path.isfile(cfile)==0:
host=input('请输入ip地址:')
username=input('请输入用户名:')
port=input('请输入端口号:')
password=input('请输入密码:')
saveconfig(cfile,host,port,username,password)
else:
os.chdir (path)
for each in uplist:
uploadfile(ftp,each,each)
os.system('mshta vbscript:msgbox("海尔数据库自动备份成功!",64,"海尔备份程序 by basfan")(window.close)')
|