python 寫一個(gè)文件分發(fā)小程序
一、概述
該小程序?qū)崿F(xiàn)從源端到目標(biāo)端的文件一鍵拷貝,源端和目標(biāo)段都在一臺(tái)電腦上面,只是目錄不同而已
二、參數(shù)文件說(shuō)明
1. settings.txt的說(shuō)明a. 通過(guò)配置settings.txt,填源端和目標(biāo)端路徑,如果用反斜杠結(jié)尾表示填的是文件夾,如果不是反斜杠結(jié)尾則代表填的是文件b. 如果是按日期自動(dòng)生成的文件夾,則用{YYYYMMMDD}或{MMDD}等替代c. 文件支持*匹配任意名字d. 在no_create_ok_file組中,表示不生成ok標(biāo)識(shí),在create_ok_file組中表示生成ok標(biāo)識(shí)e. 如果settings.txt填寫不正確,運(yùn)行這個(gè)小程序就會(huì)生成一個(gè)error.log,但是不影響后面的拷貝
舉例D:test3{YYYYMMDD} = E:test4{YYYYMMDD},如果在執(zhí)行程序的時(shí)候不填日期,直接回車,這個(gè){YYYYMMDD}就自動(dòng)替換為當(dāng)天的日期,如果填了日期(如20191115),那{YYYYMMDD}就自動(dòng)替換為20191115D:test1fa* = E:test2,這個(gè)就表示把D:test1目錄下的以fa開(kāi)頭的文件全部拷貝到E:test2中去
2. okfile.txt的說(shuō)明okfile.txt填的源端的ok文件,有些系統(tǒng)在生成文件的時(shí)候,會(huì)生成一個(gè)ok文件,表示系統(tǒng)文件已經(jīng)生成完成。okfile.txt就是來(lái)校驗(yàn)這些文件是否存在,如果不存在,那么運(yùn)行這個(gè)小程序的時(shí)候就會(huì)生成一個(gè)warn.log,但是不影響實(shí)際的拷貝。
三、程序說(shuō)明
由于業(yè)務(wù)人員不懂python,也沒(méi)有裝開(kāi)發(fā)環(huán)境,因此通過(guò)將python文件打包成一個(gè)exe的形式,方便他們操作。
pip isntall PyInstaller # 安裝PyInstaller包pyinstaller -F filetran.py --icon=rocket.ico # 將.py文件和.ico文件放在一起,在dist目錄下面生成exe文件
由于我的py文件需要讀這兩個(gè)配置文件,因此還需要將.exe文件和這兩個(gè)配置文件放在同一個(gè)目錄下面,就可以到任意一臺(tái)windows下面執(zhí)行了
四、附上代碼filetran.py
# autor: yangbao# date: 2019-10-16import osimport timeimport datetimeimport reimport shutilimport configparserdef 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 variabledef source_to_target(): '''讀取settings.txt文件,將源端和目標(biāo)端映射關(guān)系對(duì)上''' 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_dictdef 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 Falsedef filecopy(): '''文件拷貝''' # 得到映射表 source_to_target_dict = source_to_target() # 讀取每一個(gè)目標(biāo)路徑 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: # 如果目標(biāo)路徑不存在,就創(chuàng)建 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, ’ 開(kāi)始拷貝’, 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): # 如果目標(biāo)路徑不存在,就創(chuàng)建 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, ’ 開(kāi)始拷貝’, 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(’請(qǐng)輸入需要拷貝的8位指定日期,如20191114,如果不輸入,默認(rèn)拷貝當(dāng)天n’) # 如果沒(méi)輸入,或者輸入格式正確,就拷貝 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’), ’] ’, ’文件開(kāi)始拷貝...’, 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’), ’] ’, ’文件拷貝結(jié)束,總耗時(shí)’, cost_time, ’秒’, sep=’’) # 如果輸入格式不正確 elif not re.match(’d{8}’, customer_input): print(’請(qǐng)輸入正確的格式’) input(’按回車鍵退出’)
settings.txt
# 拷貝路徑設(shè)置# 源端路徑不存在就不復(fù)制,目標(biāo)端路徑不存在會(huì)自動(dòng)創(chuàng)建目錄# 說(shuō)明事項(xiàng):# 1. 格式為源端路徑 = 目標(biāo)路徑# 2. 文件夾后面以反斜杠結(jié)束# 3. 如果是變量,則以大括號(hào)闊起來(lái),如今天是20191012, {YYYYMMDD}會(huì)替換為20191012,則使用{MMDD}替換為1012,{DD}替換為12# 4. YYYY MM DD都填大寫# 以下是示例# 拷貝整個(gè)文件夾 --> P:信息技術(shù)部YangBaooa = E:test2# 拷貝指定名稱,*表示匹配任意字符 --> D:test3{YYYYMMDD}ab* = E:test4{YYYYMMDD}[no_create_ok_file]# 將不需要生成ok標(biāo)識(shí)的路徑或文件填在這下面D:test3{YYYYMMDD} = E:test4{YYYYMMDD}[create_ok_file]# 將需要生成ok標(biāo)識(shí)的路徑或文件填在這下面D:test1 = E:test2
okfile.txt
# ok文件設(shè)置設(shè)置# 以下是示例# {YYYYMMDD}會(huì)替換成指定日期,D:test3{YYYYMMDD}ab.txt# D:test3{YYYYMMDD}sdfg
filetran.exe
https://pan.baidu.com/s/1vxO6UycDtz5nN4DpmjLN5w 提取碼:bgdu
注意不管是使用python去執(zhí)行filetran.py,還是單擊filetran.exe,都需要跟settings.txt和okfile.txt放在一起,否則程序會(huì)報(bào)錯(cuò)。
以上就是python 寫一個(gè)文件分發(fā)小程序的詳細(xì)內(nèi)容,更多關(guān)于python 文件分發(fā)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. asp讀取xml文件和記數(shù)2. PHP實(shí)現(xiàn)基本留言板功能原理與步驟詳解3. 每日六道java新手入門面試題,通往自由的道路第二天4. vue 驗(yàn)證兩次輸入的密碼是否一致的方法示例5. python利用opencv實(shí)現(xiàn)顏色檢測(cè)6. 讓你的PHP同時(shí)支持GIF、png、JPEG7. CSS自定義滾動(dòng)條樣式案例詳解8. 簡(jiǎn)體中文轉(zhuǎn)換為繁體中文的PHP函數(shù)9. 多個(gè)SpringBoot項(xiàng)目采用redis實(shí)現(xiàn)Session共享功能10. JavaScript快速實(shí)現(xiàn)一個(gè)顏色選擇器
