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('[',' 拷貝完成',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('[',sep='') def warnlog(): """警告日誌""" with open('okfile.txt',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,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('[','檔案開始拷貝...',sep='') print('-' * 50) filecopy() warnlog() end_time = datetime.datetime.now() cost_time = (end_time - begin_time).seconds print('-' * 50) print('[','檔案拷貝結束,總耗時',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 檔案分發的資料請關注我們其它相關文章!