這篇文章主要介紹了python 寫一個檔案分發小程式,幫助大家更好的理解和學習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的形式,方便他們操作。
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放在一起,否則程式會報錯。