python 写一个文件分发小程序


Posted in Python onDecember 05, 2020

一、概述

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

二、参数文件说明

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('按回车键退出')

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\

okfile.txt

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

# D:\test3\{YYYYMMDD}\sdfg

filetran.exe

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

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

以上就是python 写一个文件分发小程序的详细内容,更多关于python 文件分发的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python递归打印某个目录的内容(实例讲解)
Aug 30 Python
python+django加载静态网页模板解析
Dec 12 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
django表单实现下拉框的示例讲解
May 29 Python
将pandas.dataframe的数据写入到文件中的方法
Dec 07 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
Python 列表去重去除空字符的例子
Jul 20 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
python zip()函数的使用示例
Sep 23 Python
python使用shell脚本创建kafka连接器
Apr 29 Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 #Python
用python对oracle进行简单性能测试
Dec 05 #Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 #Python
python自动从arxiv下载paper的示例代码
Dec 05 #Python
python使用dlib进行人脸检测和关键点的示例
Dec 05 #Python
python从ftp获取文件并下载到本地
Dec 05 #Python
python基于socket模拟实现ssh远程执行命令
Dec 05 #Python
You might like
php正则校验用户名介绍
2008/07/19 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
JS解密入门 最终变量劫持
2008/06/25 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
django输出html内容的实例
2018/05/27 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
同学聚会欢迎辞
2014/01/14 职场文书
篮球比赛策划方案
2014/06/05 职场文书
学校周年庆活动方案
2014/08/22 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
五一劳动节活动总结
2015/02/09 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电