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写的创建文件夹自定义函数mkdir()
Aug 25 Python
Python进行数据科学工作的简单入门教程
Apr 01 Python
Python标准库sched模块使用指南
Jul 06 Python
使用pycharm生成代码模板的实例
May 23 Python
python安装twisted的问题解析
Aug 21 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
python打开windows应用程序的实例
Jun 28 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
PyCharm 无法 import pandas 程序卡住的解决方式
Mar 09 Python
python中rb含义理解
Jun 18 Python
python 实现逻辑回归
Dec 30 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批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python中__call__内置函数用法实例
2015/06/04 Python
Python3实现Web网页图片下载
2016/01/28 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
行政助理岗位职责
2013/11/10 职场文书
技术总监的工作职责
2013/11/13 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
Python中字符串对象语法分享
2022/02/24 Python
yolov5返回坐标的方法实例
2022/03/17 Python
Java实现二分搜索树的示例代码
2022/03/17 Java/Android