#!/usr/bin/env python # -*- coding:utf-8 -*- # # Vendor: 9sdata.cn # Create At: 2019/1/3 0003 # # 本程序为分光数据接入使用。用于把十所推送的数据(zip)分别 move 到当前整点小时的指定目录下,便于接入程序scan。 # 因十所 ftp 推送只支持推送到 ftp 根目录下,因此可能会导致根目录下文件数量过多。导致程序在 listDir 时时间过长。 # 因此开发本程序,分解压力。 # 该程序可设置为 Linux 定时执行,每 5 分钟执行一次。该程序可能会导致需要升级Python # __author__ = "ZhenQin" import os, stat import os.path as path from datetime import datetime import shutil import logging BASE_DIR = path.abspath(__file__ + "/../") # 当前脚本文件目录,无需更改 DATA_ROOT_PATH = "/Users/zhenqin/temp/ftp" # 十所推送数据目录,在FTP的根目录 DATE_TARGET_PATH = "/Users/zhenqin/temp/tar_gz" # 需要 move 到的目录,在FTP根目录下 /fenguang/,会自动按照小时创建目录 FILTER_FILE_SUBFIX = (".sql", ".txt") # 扫描的文件后缀,无需更改 log = logging.getLogger(__name__) log.setLevel(logging.INFO) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() # 定义handler的输出格式formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) # 给logger添加handler #logger.addFilter(filter) log.addHandler(ch) if not path.exists(path.abspath(DATE_TARGET_PATH)): # 如果目标目录不存在,则创建 os.mkdir(path.abspath(DATE_TARGET_PATH)) # 创建目录 os.chmod(path.abspath(DATE_TARGET_PATH), stat.S_IRWXU + stat.S_IRWXG + stat.S_IRWXO) # 授权目录权限为777 log.info("mkdir: %s" % path.abspath(DATE_TARGET_PATH)) def moveFile(file): currHour = datetime.now().strftime("%Y%m%d%H") target_dir = path.abspath(path.join(DATE_TARGET_PATH, currHour)) if not path.exists(target_dir): # 如果目标目录不存在,则创建当前整点数据 os.mkdir(target_dir) # 创建目录 os.chmod(target_dir, stat.S_IRWXU + stat.S_IRWXG + stat.S_IRWXO) # 授权目录权限为777 log.info("mkdir: %s" % target_dir) src_file = file log.info("move file %s to %s" % (src_file, target_dir)) shutil.move(src_file, target_dir + "/" + path.basename(file)) os.chmod(path.join(target_dir, path.basename(file)), stat.S_IRWXU+stat.S_IRWXG+stat.S_IRWXO) # move文件,把文件权限改为777 def scanFile(): """ 扫描文件,把需要处理的后缀文件move到另一个目录下 :return: """ files = os.listdir(DATA_ROOT_PATH) for file in files: point_index = file.find(".") subfix = file[point_index:] if point_index > 0 else "" curr_file = path.abspath(path.join(DATA_ROOT_PATH, file)) if path.isfile(curr_file) and FILTER_FILE_SUBFIX.count(subfix) > 0: # 处理的文件后缀名包含待处理的文件 moveFile(curr_file) else: log.info("skip file: %s" % curr_file) if __name__ == "__main__": log.info("current dir: %s" % BASE_DIR) scanFile()