一直以来都是用shell来做一些自动化及数据分析工作,即便是有些window下的机器我也通过数据库的状态去处理一些问题。其间虽一直有在学习pyth但未能实际使用,有问题总想着用shell 解决。
最近有个需求:需要将保存在语音服务器上的文件下载至业务服务器并且清除语音服务器上的文件。这个脚本参考了网上python ftp上传的部份脚本,结合自己的需求添加修改(未优化及适配)。最后因为要部署到客户机器所以使用py2exe转成exe程序。
功能:
检测并同步远端文件至本机,并且在符合条件的情况下删除(一天只删除一次)
有几个地方说明下,以后给自己备注下:
1:转成exe程序(需先安装对应版本的py2exe)
python win.py py2exe
-
from distutils.core import setup
-
import py2exe
-
setup(console=["ftp_win.py"])
当前目录下生成dist目录,运行ftp_win.exe 即可。如果有配置文件需要将配置文件拷贝至对应的位置。
2:配置文件的处理,因为没有几个所以采用这种办法获取:
-
#读取配置文件
-
config = ConfigParser.ConfigParser()
-
config.read("./cfg/ftp.cfg")
-
hostaddr = config.get("ftp","ip")
-
username = config.get("ftp","use")
-
password = config.get("ftp","passwd")
-
port = config.get("ftp","port")
-
rootdir_local = config.get("ftp","localpath")
-
rootdir_remote = config.get("ftp","remotepath")
配置文件格式:
-
[ftp]
-
ip = 192.168.1.172
-
use = windigit
-
passwd = windigit
-
port = 21
-
#ftp 主目录
-
remotepath = ./
-
localpath = F:\data
附最后脚本:
-
#!/usr/bin/python
-
#-*- encoding: gbk -*-
-
'''
-
ftp自动下载、可以递归目录操作,每晚4点删除远端文件。
-
循环检测,有新文件则下载,大小一致则不下载。
-
'''
-
from ftplib import FTP
-
import os,sys,string,datetime,time,ConfigParser
-
import socket
-
-
class MYFTP:
-
def __init__(self, hostaddr, username, password, remotedir, port=21):
-
self.hostaddr = hostaddr
-
self.username = username
-
self.password = password
-
self.remotedir = remotedir
-
self.port = port
-
self.ftp = FTP()
-
self.file_list = []
-
def __del__(self):
-
self.ftp.close()
-
def login(self):
-
ftp = self.ftp
-
try:
-
timeout = 60
-
socket.setdefaulttimeout(timeout)
-
ftp.set_pasv(True)
-
print '开始连接到 %s' %(self.hostaddr)
-
ftp.connect(self.hostaddr, self.port)
-
print '成功连接到 %s' %(self.hostaddr)
-
print '开始登录到 %s' %(self.hostaddr)
-
ftp.login(self.username, self.password)
-
print '成功登录到 %s' %(self.hostaddr)
-
debug_print(ftp.getwelcome())
-
except Exception:
-
deal_error("连接或登录失败")
-
try:
-
ftp.cwd(self.remotedir)
-
except(Exception):
-
deal_error('切换目录失败')
-
def is_same_size(self, localfile, remotefile):
-
try:
-
remotefile_size = self.ftp.size(remotefile)
-
except:
-
remotefile_size = -1
-
try:
-
localfile_size = os.path.getsize(localfile)
-
except:
-
localfile_size = -1
-
#debug_print('lo:%d re:%d' %(localfile_size, remotefile_size),)
-
if remotefile_size == localfile_size:
-
return 1
-
else:
-
return 0
-
def download_file(self, localfile, remotefile):
-
if self.is_same_size(localfile, remotefile):
-
debug_print('%s 文件大小相同,无需下载' %localfile)
-
#删除文件
-
f.remove_file(remotefile)
-
return
-
else:
-
debug_print('>>>>>>>>>>>>下载文件 %s ... ...' %localfile)
-
file_handler = open(localfile, 'wb')
-
self.ftp.retrbinary('RETR %s'%(remotefile), file_handler.write)
-
file_handler.close()
-
#删除文件
-
f.remove_file(remotefile)
-
#return
-
def download_files(self, localdir='./', remotedir='./'):
-
try:
-
self.ftp.cwd(remotedir)
-
except:
-
debug_print('目录%s不存在,继续...' %remotedir)
-
return
-
if not os.path.isdir(localdir):
-
os.makedirs(localdir)
-
debug_print('切换至目录 %s' %self.ftp.pwd())
-
self.file_list = []
-
self.ftp.dir(self.get_file_list)
-
remotenames = self.file_list
-
for item in remotenames:
-
filetype = item[0]
-
filename = item[1]
-
local = os.path.join(localdir, filename)
-
if filetype == 'd':
-
self.download_files(local, filename)
-
elif filetype == '-':
-
self.download_file(local, filename)
-
self.ftp.cwd('..')
-
debug_print('返回上层目录 %s' %self.ftp.pwd())
-
def get_file_list(self, line):
-
ret_arr = []
-
file_arr = self.get_filename(line)
-
if file_arr[1] not in ['.', '..']:
-
self.file_list.append(file_arr)
-
def get_filename(self, line):
-
pos = line.rfind(':')
-
while(line[pos] != ' '):
-
pos += 1
-
while(line[pos] == ' '):
-
pos += 1
-
file_arr = [line[0], line[pos:]]
-
return file_arr
-
def remove_file(self,remotefile):
-
#每天04点处理删除文件
-
now_date = time.strftime('%Y-%m-%d %H', timenow)
-
remove_date = time.strftime('%Y-%m-%d 04', timenow)
-
#debug_print('文件时间:%s' %self.ftp.retrlines('list'))
-
if now_date == remove_date:
-
remove_log='正在删除%s 文件...\n' %remotefile
-
debug_print(remove_log)
-
file.write(remove_log)
-
self.ftp.delete(remotefile)
-
def debug_print(s):
-
print (s)
-
def deal_error(err):
-
logstr = '%s 发生错误: %s\n' %(datenow, err)
-
debug_print(logstr)
-
file.write(logstr)
-
sys.exit()
-
if __name__ == '__main__':
-
#读取配置文件
-
config = ConfigParser.ConfigParser()
-
config.read("./cfg/ftp.cfg")
-
hostaddr = config.get("ftp","ip")
-
username = config.get("ftp","use")
-
password = config.get("ftp","passwd")
-
port = config.get("ftp","port")
-
rootdir_local = config.get("ftp","localpath")
-
rootdir_remote = config.get("ftp","remotepath")
-
#-------------------------------------------------------------
-
timenow = time.localtime()
-
datenow = time.strftime('%Y-%m-%d %H:%M:%S', timenow)
-
f = MYFTP(hostaddr, username, password, rootdir_remote, port)
-
while 1==1:
-
file = open("log.txt", "a")
-
f.login()
-
f.download_files(rootdir_local, rootdir_remote)
-
#-------------------------------------------------------------
-
logstr="%s 扫描完毕\n" %datenow
-
debug_print(logstr)
-
file.write(logstr)
-
file.close()
-
time.sleep(10)
阅读(2599) | 评论(0) | 转发(0) |