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:\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的形式,方便他们操作。
pipisntallPyInstaller#安装PyInstaller包 pyinstaller-Ffiletran.py--icon=rocket.ico#将.py文件和.ico文件放在一起,在dist目录下面生成exe文件
由于我的py文件需要读这两个配置文件,因此还需要将.exe文件和这两个配置文件放在同一个目录下面,就可以到任意一台windows下面执行了
四、附上代码
filetran.py
#autor:yangbao
#date:2019-10-16
importos
importtime
importdatetime
importre
importshutil
importconfigparser
defvariable_replace(variable):
"""路径替换"""
globalcustomer_input
local_customer_input=customer_input
iflocal_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'))
ifre.search('{YYYYMMDD}',variable):
variable=variable.replace('{YYYYMMDD}',curr_year+curr_month+curr_day)
ifre.search('{YYYYMM}',variable):
variable=variable.replace('{YYYYMM}',curr_year+curr_month)
ifre.search('{MMDD}',variable):
variable=variable.replace('{MMDD}',curr_month+curr_day)
ifre.search('{YYYY}',variable):
variable=variable.replace('{YYYY}',curr_year)
ifre.search('{MM}',variable):
variable=variable.replace('{MM}',curr_month)
ifre.search('{DD}',variable):
variable=variable.replace('{DD}',curr_day)
returnvariable
defsource_to_target():
"""读取settings.txt文件,将源端和目标端映射关系对上"""
source_to_target_dict={}
withopen('settings.txt','r',encoding='utf-8-sig')asf:
forlineinf.readlines():
#排除注释和空行和格式不正确的
ifnotline.startswith('#')andline.strip()!=''andre.search('=',line):
source=line.split('=')[0].strip()
target=line.split('=')[1].strip()
source_to_target_dict[source]=target
returnsource_to_target_dict
defcreate_ok_file(source):
"""读取配置文件"""
cf=configparser.ConfigParser(delimiters=('='))
cf.read("settings.txt",encoding='utf-8-sig')
options=cf.options("create_ok_file")
foriinoptions:
ifsource.lower()==i.lower().strip():
returnTrue
returnFalse
deffilecopy():
"""文件拷贝"""
#得到映射表
source_to_target_dict=source_to_target()
#读取每一个目标路径
forori_source,ori_targetinsource_to_target_dict.items():
source=variable_replace(ori_source)
target=variable_replace(ori_target)
#如果源端填的是文件夹
ifsource.endswith(os.sep):
ifos.path.exists(source):
file_list=os.listdir(source)
forfilenameinfile_list:
#如果目标路径不存在,就创建
ifnotos.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)
ifcreate_ok_file(ori_source):
ok_file=target_file+'.ok'
fp=open(ok_file,'w')
fp.close()
exceptExceptionase:
withopen(error_log_name,'a+',encoding='utf-8-sig')asf:
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:]#得到该文件的文件样式
ifos.path.exists(source_dir):
file_list=os.listdir(source_dir)
forfilenameinfile_list:
#只有匹配上的才拷贝
ifre.match(file_name_pattern,filename):
#如果目标路径不存在,就创建
ifnotos.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)
ifcreate_ok_file(ori_source):
ok_file=target_file+'.ok'
fp=open(ok_file,'w')
fp.close()
exceptExceptionase:
withopen(error_log_name,'a+',encoding='utf-8-sig')asf:
f.write(str(e))
f.write('\n')
break
#print('[',time.strftime('%Y-%m-%d%H:%M:%S'),']',source_file,'---->',target_file,'拷贝完成',sep='')
defwarnlog():
"""警告日志"""
withopen('okfile.txt','r',encoding='utf-8')asf:
forlineinf.readlines():
#排除注释和空行和格式不正确的
ifnotline.startswith('#')andline.strip()!='':
okfile=variable_replace(line.strip())
ifnotos.path.isfile(okfile):
withopen(warn_log_name,'a+',encoding='utf-8-sig')ast:
t.write(okfile+'该文件不存在!')
t.write('\n')
if__name__=='__main__':
#主程序
customer_input=input('请输入需要拷贝的8位指定日期,如20191114,如果不输入,默认拷贝当天\n')
#如果没输入,或者输入格式正确,就拷贝
ifre.match('\d{8}',customer_input)ornotcustomer_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='')
#如果输入格式不正确
elifnotre.match('\d{8}',customer_input):
print('请输入正确的格式')
input('按回车键退出')
settings.txt
#拷贝路径设置
#源端路径不存在就不复制,目标端路径不存在会自动创建目录
#说明事项:
#1.格式为源端路径=目标路径
#2.文件夹后面以反斜杠结束\
#3.如果是变量,则以大括号阔起来,如今天是20191012,{YYYYMMDD}会替换为20191012,则使用{MMDD}替换为1012,{DD}替换为12
#4.YYYYMMDD都填大写
#以下是示例
#拷贝整个文件夹-->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文件分发的资料请关注毛票票其它相关文章!