Chinaunix首页 | 论坛 | 博客
  • 博客访问: 234963
  • 博文数量: 37
  • 博客积分: 325
  • 博客等级: 一等列兵
  • 技术积分: 1199
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-09 00:04
个人简介

坚持原创,虽然有些东西很简单,但也算是一种积累。

文章分类

全部博文(37)

文章存档

2013年(28)

2012年(9)

我的朋友

分类: Python/Ruby

2013-09-27 20:00:40

    一直以来都是用shell来做一些自动化及数据分析工作,即便是有些window下的机器我也通过数据库的状态去处理一些问题。其间虽一直有在学习pyth但未能实际使用,有问题总想着用shell 解决。

    最近有个需求:需要将保存在语音服务器上的文件下载至业务服务器并且清除语音服务器上的文件。这个脚本参考了网上python ftp上传的部份脚本,结合自己的需求添加修改(未优化及适配)。最后因为要部署到客户机器所以使用py2exe转成exe程序。
    

功能:
    检测并同步远端文件至本机,并且在符合条件的情况下删除(一天只删除一次)


有几个地方说明下,以后给自己备注下:
1:转成exe程序(需先安装对应版本的py2exe)
python win.py  py2exe

点击(此处)折叠或打开

  1. from distutils.core import setup
  2. import py2exe
  3. setup(console=["ftp_win.py"])
当前目录下生成dist目录,运行ftp_win.exe 即可。如果有配置文件需要将配置文件拷贝至对应的位置。


2:配置文件的处理,因为没有几个所以采用这种办法获取:

点击(此处)折叠或打开

  1. #读取配置文件
  2.     config = ConfigParser.ConfigParser()
  3.     config.read("./cfg/ftp.cfg")
  4.     hostaddr = config.get("ftp","ip")
  5.     username = config.get("ftp","use")
  6.     password = config.get("ftp","passwd")
  7.     port = config.get("ftp","port")
  8.     rootdir_local = config.get("ftp","localpath")
  9.     rootdir_remote = config.get("ftp","remotepath")
配置文件格式:

点击(此处)折叠或打开

  1. [ftp]
  2. ip = 192.168.1.172
  3. use = windigit
  4. passwd = windigit
  5. port = 21
  6. #ftp 主目录
  7. remotepath = ./
  8. localpath = F:\data

附最后脚本:

点击(此处)折叠或打开

  1. #!/usr/bin/python
  2. #-*- encoding: gbk -*-
  3. '''
  4.     ftp自动下载、可以递归目录操作,每晚4点删除远端文件。
  5.     循环检测,有新文件则下载,大小一致则不下载。
  6. '''
  7. from ftplib import FTP
  8. import os,sys,string,datetime,time,ConfigParser
  9. import socket

  10. class MYFTP:
  11.     def __init__(self, hostaddr, username, password, remotedir, port=21):
  12.         self.hostaddr = hostaddr
  13.         self.username = username
  14.         self.password = password
  15.         self.remotedir = remotedir
  16.         self.port = port
  17.         self.ftp = FTP()
  18.         self.file_list = []
  19.     def __del__(self):
  20.         self.ftp.close()
  21.     def login(self):
  22.         ftp = self.ftp
  23.         try:
  24.             timeout = 60
  25.             socket.setdefaulttimeout(timeout)
  26.             ftp.set_pasv(True)
  27.             print '开始连接到 %s' %(self.hostaddr)
  28.             ftp.connect(self.hostaddr, self.port)
  29.             print '成功连接到 %s' %(self.hostaddr)
  30.             print '开始登录到 %s' %(self.hostaddr)
  31.             ftp.login(self.username, self.password)
  32.             print '成功登录到 %s' %(self.hostaddr)
  33.             debug_print(ftp.getwelcome())
  34.         except Exception:
  35.             deal_error("连接或登录失败")
  36.         try:
  37.             ftp.cwd(self.remotedir)
  38.         except(Exception):
  39.             deal_error('切换目录失败')
  40.     def is_same_size(self, localfile, remotefile):
  41.         try:
  42.             remotefile_size = self.ftp.size(remotefile)
  43.         except:
  44.             remotefile_size = -1
  45.         try:
  46.             localfile_size = os.path.getsize(localfile)
  47.         except:
  48.             localfile_size = -1
  49.         #debug_print('lo:%d re:%d' %(localfile_size, remotefile_size),)
  50.         if remotefile_size == localfile_size:
  51.              return 1
  52.         else:
  53.             return 0
  54.     def download_file(self, localfile, remotefile):
  55.         if self.is_same_size(localfile, remotefile):
  56.              debug_print('%s 文件大小相同,无需下载' %localfile)
  57.              #删除文件
  58.              f.remove_file(remotefile)
  59.              return
  60.         else:
  61.             debug_print('>>>>>>>>>>>>下载文件 %s ... ...' %localfile)
  62.             file_handler = open(localfile, 'wb')
  63.             self.ftp.retrbinary('RETR %s'%(remotefile), file_handler.write)
  64.             file_handler.close()
  65.             #删除文件
  66.             f.remove_file(remotefile)
  67.         #return
  68.     def download_files(self, localdir='./', remotedir='./'):
  69.         try:
  70.             self.ftp.cwd(remotedir)
  71.         except:
  72.             debug_print('目录%s不存在,继续...' %remotedir)
  73.             return
  74.         if not os.path.isdir(localdir):
  75.             os.makedirs(localdir)
  76.         debug_print('切换至目录 %s' %self.ftp.pwd())
  77.         self.file_list = []
  78.         self.ftp.dir(self.get_file_list)
  79.         remotenames = self.file_list
  80.         for item in remotenames:
  81.             filetype = item[0]
  82.             filename = item[1]
  83.             local = os.path.join(localdir, filename)
  84.             if filetype == 'd':
  85.                 self.download_files(local, filename)
  86.             elif filetype == '-':
  87.                 self.download_file(local, filename)
  88.         self.ftp.cwd('..')
  89.         debug_print('返回上层目录 %s' %self.ftp.pwd())
  90.     def get_file_list(self, line):
  91.         ret_arr = []
  92.         file_arr = self.get_filename(line)
  93.         if file_arr[1] not in ['.', '..']:
  94.             self.file_list.append(file_arr)
  95.     def get_filename(self, line):
  96.         pos = line.rfind(':')
  97.         while(line[pos] != ' '):
  98.             pos += 1
  99.         while(line[pos] == ' '):
  100.             pos += 1
  101.         file_arr = [line[0], line[pos:]]
  102.         return file_arr
  103.     def remove_file(self,remotefile):
  104.         #每天04点处理删除文件
  105.         now_date = time.strftime('%Y-%m-%d %H', timenow)
  106.         remove_date = time.strftime('%Y-%m-%d 04', timenow)
  107.         #debug_print('文件时间:%s' %self.ftp.retrlines('list'))
  108.         if now_date == remove_date:
  109.             remove_log='正在删除%s 文件...\n' %remotefile
  110.             debug_print(remove_log)
  111.             file.write(remove_log)
  112.             self.ftp.delete(remotefile)
  113. def debug_print(s):
  114.     print (s)
  115. def deal_error(err):
  116.     logstr = '%s 发生错误: %s\n' %(datenow, err)
  117.     debug_print(logstr)
  118.     file.write(logstr)
  119.     sys.exit()
  120. if __name__ == '__main__':
  121.     #读取配置文件
  122.     config = ConfigParser.ConfigParser()
  123.     config.read("./cfg/ftp.cfg")
  124.     hostaddr = config.get("ftp","ip")
  125.     username = config.get("ftp","use")
  126.     password = config.get("ftp","passwd")
  127.     port = config.get("ftp","port")
  128.     rootdir_local = config.get("ftp","localpath")
  129.     rootdir_remote = config.get("ftp","remotepath")
  130.     #-------------------------------------------------------------
  131.     timenow = time.localtime()
  132.     datenow = time.strftime('%Y-%m-%d %H:%M:%S', timenow)
  133.     f = MYFTP(hostaddr, username, password, rootdir_remote, port)
  134. while 1==1:
  135.     file = open("log.txt", "a")
  136.     f.login()
  137.     f.download_files(rootdir_local, rootdir_remote)
  138.     #-------------------------------------------------------------
  139.     logstr="%s 扫描完毕\n" %datenow
  140.     debug_print(logstr)
  141.     file.write(logstr)
  142.     file.close()
  143.     time.sleep(10)


阅读(2522) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~