首頁>技術>

這篇文章主要介紹了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放在一起,否則程式會報錯。

24
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 程式設計去除背景綠幕摳圖,基於.NET+OpenCVSharp