Why
因为经常需要拷贝某固定目录的日志文件和压缩,故而使用python脚本把这个工作实现了。使用配置文件的方式配置文件拷贝和移动的目录,基本能满足简单使用
How
- 使用os.path 实现对文件和目录判断相关功能,如:os.path.abspath()/os.path.exists
- 使用shutil模块实现对文件和文件夹的移动拷贝、删除,压缩
- 使用configparser模块实现对ini配置文件的读取
- 使用traceback的方法format_exc()打印捕捉到的异常
- 使用pyinstaller将实现好功能的python文件打包成exe执行。
Code And ConfigFile
# -*- coding: UTF-8 -*-
import os
#import sys
import shutil
import time
import configparser
import traceback
def copy_and_zip(file_list, dst_folder_name,zipAndDel,FolderAddNow):
'''
批量复制文件到指定文件夹,然后把指定文件夹的内容压缩成ZIP并且删掉该文件夹
:param file_list: 文件或文件夹
:param dst_folder_name: 目标压缩文件的名称
:return:
'''
if (0==len(dst_folder_name.split())):
dstfile = os.path.abspath(os.getcwd())
# 把输出文件的路径选到了程序根目录下
dst_folder_name = dstfile+"\\Log"
if (FolderAddNow==1):
now=time.strftime("%Y%m%d_%H%M%S")
dst_folder_name=dst_folder_name+now
if not os.path.exists(dst_folder_name):
os.makedirs(dst_folder_name) # 创建路径
for item in file_list:
copy_file(item, dst_folder_name)
if (zipAndDel==1):
shutil.make_archive(dst_folder_name, "zip", dst_folder_name,)
#删除原有的文件夹
shutil.rmtree(dst_folder_name)
def copy_file(srcfile, filename):
'''
把文件或文件夹复制到指定目录中
:param srcfile: 文件或者文件夹的绝对路径
:param filename: 指定目录
:return:
'''
if not os.path.isfile(srcfile):
last_name = os.path.basename(srcfile)
destination_name = filename +"\\" + last_name
shutil.copytree(srcfile, destination_name)
print("copy %s -> %s" % (srcfile, destination_name))
else:
fpath, fname = os.path.split(srcfile) # 分离文件名和路径
shutil.copy2(srcfile, filename) # 移动文件
print("copy %s -> %s" % (srcfile, filename))
if __name__ == '__main__':
cf=configparser.ConfigParser()
try:
cf.read("CopyConfig.ini","utf-8")
file_list = cf.get("copyfile","SourceFiles").split('|')
# 目标压缩包名
folder_name = cf.get("copyfile","DestFolder")
zipAndDel=cf.getint("copyfile","zipAndDel")
FolderAddNow=cf.getint("copyfile","FolderAddNow")
copy_and_zip(file_list, folder_name,zipAndDel,FolderAddNow)
print("拷贝已成功!")
except Exception as e:
print("执行目录不存在CopyConfig.ini文件或者配置项不合法!参考CopyConfig.ini内容如下:")
print("[copyfile]\n;源文件和目录,多个文件或目录以|分隔\nSourceFiles=C:\log\GLog.dxdb|C:\log\123.txt\n;目的路径,为空时再执行目录生成Log文件夹\nDestFolder = CopyLog\n;是否将拷贝后的文件夹压缩并删除\nzipAndDel =1\n;拷贝后的文件夹命名是否加上当前时间\nFolderAddNow=1\n")
msg=traceback.format_exc()
print("出错信息:\n %s"%(msg))
#traceback.print_exc()
input("请输任意键+Enter或直接Enter退出!")
- 配置文件CopyConfig.ini,配置项对应功能如下
- SourceFiles源文件和目录,多个文件或目录以|分隔
- DestFolder目的路径,为空时再执行目录生成Log文件夹
- zipAndDel是否将拷贝后的文件夹压缩并删除
- FolderAddNow拷贝后的文件夹命名是否加上当前时间
[copyfile]
SourceFiles =C:\log\GLog.dxdb
DestFolder =
zipAndDel =1
FolderAddNow =1
Execute
将CopyLogFile.py和CopyConfig.ini放在某个目录,如C:\
- 安装有python3的环境直接在命令行下执行 :
python CopyLogFile.py
- 使用pyinstaller将CopyLogFile.py打包成windows下的执行程序CopyLogFile.exe
- 安装pyinstaller : pip install PyInstall ,安装成功后C:\Python36\Scripts目录下存在pyinstaller.exe程序
- 进入你的python的scripts目录下输入(其中-F指定打包后只生成一个exe格式的文件):
pyinstaller -F C:\CopyLogFile.py
- 等待运行结束,若没有错误,EXE文件会创建在python安装路径的Scripts文件夹中的dist文件夹内存在CopyLogFile.exe