• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Python - 文件分发小程序

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、概述

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


二、参数文件说明

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:\test3\{YYYYMMDD}\ = E:\test4\{YYYYMMDD}\,如果在执行程序的时候不填日期,直接回车,这个{YYYYMMDD}就自动替换为当天的日期,如果填了日期(如20191115),那{YYYYMMDD}就自动替换为20191115
D:\test1\fa* = E:\test2\,这个就表示把D:\test1目录下的以fa开头的文件全部拷贝到E:\test2中去

 

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(\'\n\')
                        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(\'\n\')
                            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(\'\n\')


if __name__ == \'__main__\':
    # 主程序
    customer_input = input(\'请输入需要拷贝的8位指定日期,如20191114,如果不输入,默认拷贝当天\n\')
    # 如果没输入,或者输入格式正确,就拷贝
    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:\信息技术部\YangBao\oa\ = E:\test2\
# 拷贝指定名称,*表示匹配任意字符 --> D:\test3\{YYYYMMDD}\ab* = E:\test4\{YYYYMMDD}\

[no_create_ok_file]
# 将不需要生成ok标识的路径或文件填在这下面

D:\test3\{YYYYMMDD}\ = E:\test4\{YYYYMMDD}\


[create_ok_file]
# 将需要生成ok标识的路径或文件填在这下面

D:\test1\ = E:\test2\
View Code

 

okfile.txt

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

# D:\test3\{YYYYMMDD}\sdfg
View Code

 

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

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap