zoukankan      html  css  js  c++  java
  • Python

    一、概述

    该小程序实现从源端到目标端的文件一键拷贝,源端和目标段都在一台电脑上面,只是目录不同而已


    二、参数文件说明

    1. settings.txt的说明

    a. 通过配置settings.txt,填源端和目标端路径,如果用反斜杠结尾表示填的是文件夹,如果不是反斜杠结尾则代表填的是文件
    b. 如果是按日期自动生成的文件夹,则用{YYYYMMMDD}或{MMDD}等替代
    c. 文件支持*匹配任意名字
    d. 在no_create_ok_file组中,表示不生成ok标识,在create_ok_file组中表示生成ok标识
    e. 如果settings.txt填写不正确,运行这个小程序就会生成一个error.log,但是不影响后面的拷贝

    举例
    D: est3{YYYYMMDD} = E: est4{YYYYMMDD},如果在执行程序的时候不填日期,直接回车,这个{YYYYMMDD}就自动替换为当天的日期,如果填了日期(如20191115),那{YYYYMMDD}就自动替换为20191115
    D: est1fa* = E: est2,这个就表示把D: est1目录下的以fa开头的文件全部拷贝到E: est2中去

    2. okfile.txt的说明

    okfile.txt填的源端的ok文件,有些系统在生成文件的时候,会生成一个ok文件,表示系统文件已经生成完成。okfile.txt就是来校验这些文件是否存在,如果不存在,那么运行这个小程序的时候就会生成一个warn.log,但是不影响实际的拷贝。

    三、程序说明

    由于业务人员不懂python,也没有装开发环境,因此通过将python文件打包成一个exe的形式,方便他们操作。

    pip isntall PyInstaller  # 安装PyInstaller包
    pyinstaller -F filetran.py --icon=rocket.ico  # 将.py文件和.ico文件放在一起,在dist目录下面生成exe文件

    由于我的py文件需要读这两个配置文件,因此还需要将.exe文件和这两个配置文件放在同一个目录下面,就可以到任意一台windows下面执行了

    四、附上代码

    filetran.py

    # autor: yangbao
    # date: 2019-10-16
    import os
    import time
    import datetime
    import re
    import shutil
    import configparser
    
    
    def variable_replace(variable):
        """路径替换"""
        global customer_input
        local_customer_input = customer_input
        if local_customer_input:
            curr_year = local_customer_input[0:4]
            curr_month = local_customer_input[4:6]
            curr_day = local_customer_input[6:8]
        else:
            curr_year = str(time.strftime('%Y'))
            curr_month = str(time.strftime('%m'))
            curr_day = str(time.strftime('%d'))
        if re.search('{YYYYMMDD}', variable):
            variable = variable.replace('{YYYYMMDD}', curr_year+curr_month+curr_day)
        if re.search('{YYYYMM}', variable):
            variable = variable.replace('{YYYYMM}', curr_year+curr_month)
        if re.search('{MMDD}', variable):
            variable = variable.replace('{MMDD}', curr_month+curr_day)
        if re.search('{YYYY}', variable):
            variable = variable.replace('{YYYY}', curr_year)
        if re.search('{MM}', variable):
            variable = variable.replace('{MM}', curr_month)
        if re.search('{DD}', variable):
            variable = variable.replace('{DD}', curr_day)
        return variable
    
    
    def source_to_target():
        """读取settings.txt文件,将源端和目标端映射关系对上"""
        source_to_target_dict = {}
        with open('settings.txt', 'r', encoding='utf-8-sig') as f:
            for line in f.readlines():
                # 排除注释和空行和格式不正确的
                if not line.startswith('#') and line.strip() != '' and re.search('=', line):
                    source = line.split('=')[0].strip()
                    target = line.split('=')[1].strip()
                    source_to_target_dict[source] = target
        return source_to_target_dict
    
    
    def create_ok_file(source):
        """读取配置文件"""
        cf = configparser.ConfigParser(delimiters=('='))
        cf.read("settings.txt", encoding='utf-8-sig')
        options = cf.options("create_ok_file")
        for i in options:
            if source.lower() == i.lower().strip():
                return True
        return False
    
    
    def filecopy():
        """文件拷贝"""
    
        # 得到映射表
        source_to_target_dict = source_to_target()
    
        # 读取每一个目标路径
        for ori_source, ori_target in source_to_target_dict.items():
    
            source = variable_replace(ori_source)
            target = variable_replace(ori_target)
    
            # 如果源端填的是文件夹
            if source.endswith(os.sep):
                if os.path.exists(source):
                    file_list = os.listdir(source)
                    for filename in file_list:
                        # 如果目标路径不存在,就创建
                        if not os.path.exists(target):
                            os.makedirs(target)
                        source_file = source + filename
                        target_file = target + filename
                        print('[', time.strftime('%Y-%m-%d %H:%M:%S'), ']  ', source_file, ' ----> ', target_file, ' 开始拷贝', sep='')
                        try:
                            shutil.copyfile(source_file, target_file)
                            if create_ok_file(ori_source):
                                ok_file = target_file + '.ok'
                                fp = open(ok_file, 'w')
                                fp.close()
                        except Exception as e:
                            with open(error_log_name, 'a+', encoding='utf-8-sig') as f:
                                f.write(str(e))
                                f.write('
    ')
                            break
                        # print('[', time.strftime('%Y-%m-%d %H:%M:%S'), ']  ', source_file, ' ----> ', target_file, ' 拷贝完成', sep='')
            # 如果源端填的是文件
            else:
                source_dir = source[0:source.rfind(os.sep)+1]  # 得到该文件所在的文件夹
                file_name_pattern = source[source.rfind(os.sep)+1:]  # 得到该文件的文件样式
                if os.path.exists(source_dir):
                    file_list = os.listdir(source_dir)
                    for filename in file_list:
                        # 只有匹配上的才拷贝
                        if re.match(file_name_pattern, filename):
                            # 如果目标路径不存在,就创建
                            if not os.path.exists(target):
                                os.makedirs(target)
                            source_file = source_dir + filename
                            target_file = target + filename
                            print('[', time.strftime('%Y-%m-%d %H:%M:%S'), ']  ', source_file, ' ----> ', target_file, ' 开始拷贝', sep='')
                            try:
                                shutil.copyfile(source_file, target_file)
                                if create_ok_file(ori_source):
                                    ok_file = target_file + '.ok'
                                    fp = open(ok_file, 'w')
                                    fp.close()
                            except Exception as e:
                                with open(error_log_name, 'a+', encoding='utf-8-sig') as f:
                                    f.write(str(e))
                                    f.write('
    ')
                                break
                            # print('[', time.strftime('%Y-%m-%d %H:%M:%S'), ']  ', source_file, ' ----> ', target_file, ' 拷贝完成', sep='')
    
    
    def warnlog():
        """警告日志"""
        with open('okfile.txt', 'r', encoding='utf-8') as f:
            for line in f.readlines():
                # 排除注释和空行和格式不正确的
                if not line.startswith('#') and line.strip() != '':
                    okfile = variable_replace(line.strip())
                    if not os.path.isfile(okfile):
                        with open(warn_log_name, 'a+', encoding='utf-8-sig') as t:
                            t.write(okfile + ' 该文件不存在!')
                            t.write('
    ')
    
    
    if __name__ == '__main__':
        # 主程序
        customer_input = input('请输入需要拷贝的8位指定日期,如20191114,如果不输入,默认拷贝当天
    ')
        # 如果没输入,或者输入格式正确,就拷贝
        if re.match('d{8}',customer_input) or not customer_input:
            begin_time = datetime.datetime.now()
            error_log_name = 'error_' + str(time.strftime('%Y%m%d_%H%M%S')) + '_.log'
            warn_log_name = 'warn_' + str(time.strftime('%Y%m%d_%H%M%S')) + '_.log'
            print('[', time.strftime('%Y-%m-%d %H:%M:%S'), ']  ', '文件开始拷贝...', sep='')
            print('-' * 50)
            filecopy()
            warnlog()
            end_time = datetime.datetime.now()
            cost_time = (end_time - begin_time).seconds
            print('-' * 50)
            print('[', time.strftime('%Y-%m-%d %H:%M:%S'), ']  ', '文件拷贝结束,总耗时', cost_time, '', sep='')
        # 如果输入格式不正确
        elif not re.match('d{8}', customer_input):
            print('请输入正确的格式')
        input('按回车键退出')
    View Code

    settings.txt 

    # 拷贝路径设置
    # 源端路径不存在就不复制,目标端路径不存在会自动创建目录
    # 说明事项:
    # 1. 格式为源端路径 = 目标路径
    # 2. 文件夹后面以反斜杠结束
    # 3. 如果是变量,则以大括号阔起来,如今天是20191012, {YYYYMMDD}会替换为20191012,则使用{MMDD}替换为1012,{DD}替换为12
    # 4. YYYY MM DD都填大写
    # 以下是示例
    # 拷贝整个文件夹 --> P:信息技术部YangBaooa = E:	est2
    # 拷贝指定名称,*表示匹配任意字符 --> D:	est3{YYYYMMDD}ab* = E:	est4{YYYYMMDD}
    
    [no_create_ok_file]
    # 将不需要生成ok标识的路径或文件填在这下面
    
    D:	est3{YYYYMMDD} = E:	est4{YYYYMMDD}
    
    
    [create_ok_file]
    # 将需要生成ok标识的路径或文件填在这下面
    
    D:	est1 = E:	est2
    View Code

    okfile.txt

    # ok文件设置设置
    # 以下是示例
    # {YYYYMMDD}会替换成指定日期,D:	est3{YYYYMMDD}ab.txt
    
    # D:	est3{YYYYMMDD}sdfg
    View Code

    filetran.exe
    https://files.cnblogs.com/files/ddzj01/filecopy.rar

    注意不管是使用python去执行filetran.py,还是单击filetran.exe,都需要跟settings.txt和okfile.txt放在一起,否则程序会报错。

  • 相关阅读:
    支付
    mui自定义事件带参返回mui.back()
    tomcat+nginx反向代理(实现一个服务器,一个ip共用80端口)
    mui.back()返回刷新功能
    WiFi(网络)调试Android手机
    mysql获取外键, 根据数据库名和表名获取表所对应的所有外键
    @RequestBody接收json字符串,自动将日期字符串转换为java.util.Date
    使用MySQLWorkBench绘制ER图
    jpa动态分页查找
    displaytag的Excel导出实践
  • 原文地址:https://www.cnblogs.com/ddzj01/p/11867657.html
Copyright © 2011-2022 走看看