cpp 一个文件分成两个文件写_Python 写一个文件分发小程序

这篇文章主要介绍了python 写一个文件分发小程序,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下

b8a93a432b3261dad5237de428e1548d.gif

一、概述 该小程序实现从源端到目标端的文件一键拷贝,源端和目标段都在一台电脑上面,只是目录不同而已 二、参数文件说明 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('按回车键退出')

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

okfile.txt

# ok文件设置设置

# 以下是示例

# {YYYYMMDD}会替换成指定日期,D:est3{YYYYMMDD}ab.txt

# D:est3{YYYYMMDD}sdfg

filetran.exe

https://pan.baidu.com/s/1vxO6UycDtz5nN4DpmjLN5w 提取码:bgdu

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

以上就是python 写一个文件分发小程序的详细内容,想学习更多关于python 的知识及资料请关注我噢。

本文转载于:https://www.jb51.net/article/201478.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值