一、概述

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

二、参数文件说明

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

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

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

python文件分发_python 写一个文件分发小程序相关推荐

  1. python初学者可以做的金融小程序-Python入门 —— 用pycharm写一个简单的小程序3...

    环境:Win10操作系统:Python3.7:Pycharm 题目来源:PTA 编程实例1:日期格式化 世界上不同国家有不同的写日期的习惯.比如美国人习惯写成"月-日-年",而中国 ...

  2. python简单编程例子-Python入门 —— 用pycharm写一个简单的小程序3

    环境:Win10操作系统:Python3.7:Pycharm 题目来源:PTA 编程实例1:日期格式化 世界上不同国家有不同的写日期的习惯.比如美国人习惯写成"月-日-年",而中国 ...

  3. 用Windows自带的工具写一个一键关机小程序

    如何用Windows自带的工具写一个一键关机小程序 工具/原料(打勾勾的可用可不用) 装有Windows系统的电脑 在机子上装个格式工厂(版本随意,最好更新到最新的) 制作环境 windows自带命令 ...

  4. 用微信开发者小程序写一个加法计算器小程序

    文章目录 前言 一.calculator.wxml代码 二.calculator.js代码 结果 前言 提示:用软件微信开发者小程序写一个加法计算器小程序 一.calculator.wxml代码 &l ...

  5. 用python编写一个点餐程序_Python写一个自动点餐程序

    原博文 2019-08-09 10:45 − # Python写一个自动点餐程序 ## 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘 ...

  6. 用python编写一个猜年龄的小程序-用Python来写一个男女相亲小程序|码农的情人节...

    功能: 你输入你的性别,年龄,生日,我程序就给匹配一下你喜欢的类型,下面我们具体来讲讲怎么用Python写 第一部分:用户输入部分 1.获取用户的输入:我们用raw_input() args =raw ...

  7. python写一个完整的小程序_写一个python小程序

    在windows环境下进行操作 window+R 输入cmd  创建一个文件夹 mkdir pytxt 创建一个py文件 py.py  用notepad或者记事本等工具进行编辑 或 首先声明pytho ...

  8. python画出送花表情图编程_用Python来写一个男女相亲小程序|码农的情人节

    阅读本文大概需要5分钟 码农的情人节 一年一度的情人节要来啦,这个浪漫温馨的节日,走在大街小巷,走在地铁里,走在商场里,走在电影院,姑娘们手里几乎都捧着一束花,心里都是乐滋滋的,一脸幸福的样子,忽然想 ...

  9. python中函数是一段子程序_用Python来写一个男女相亲小程序|码农的情人节

    功能: 你输入你的性别,年龄,生日,我程序就给匹配一下你喜欢的类型,下面我们具体来讲讲怎么用Python写 第一部分:用户输入部分 1.获取用户的输入:我们用raw_input() args =raw ...

最新文章

  1. 狗年拜年php源码,2018狗年拜年词大全!再也不担心拜年没祝词啦~祝您新年快乐!...
  2. Linux Kernel TCP/IP Stack — Overview
  3. Android studio .gitignore 文件的内容
  4. MySQL中SELECT语句简单使用
  5. tryLock尝试获取锁
  6. mysql的内连接与外连接
  7. 中国AI军团争霸机器阅读理解大赛,搜狗创下全球新纪录
  8. 项目出现 The superclass “javax.servlet.http.HttpServlet“ was not found on the Java Build Path 解决方法
  9. 屏蔽爬虫之robots.txt
  10. 我开发的内部ORM(一)数据库组件
  11. Android获取md5和sha
  12. 8-思科防火墙:Cisco ASA uRPF运用
  13. vs2012窗体嵌入表格_2012年电子表格日
  14. 5.20——工作记录
  15. windows ios良心软件推荐
  16. python训练Word2Vec词向量
  17. 全面解析JavaScript中对于字符串子串的查询方法
  18. php fileinfo 作用,PHP Fileinfo函数 详解
  19. 了解 ARM Coretex-A 系列芯片
  20. 比比看手机安全软件谁更强?【系统收藏】

热门文章

  1. 记录一次Docker For Windows10镜像加速器配置
  2. Java设计模式---桥接Bridge模式
  3. ETHNET DHCP的两种方式
  4. JDK自带线程池介绍及使用环境
  5. 解决安装python第三方模块 '-mno-cygwin'报错的问题
  6. 定义变量时一定要初始化
  7. Turbo C 2.0 集成调试器的使用方法
  8. 苹果CEO 斯蒂夫.乔布斯:我如何工作
  9. Leetcode 141.环形链表
  10. C++编程语言之赋值运算符