Python 复制/移动 和 压缩文件/文件夹

Why

因为经常需要拷贝某固定目录的日志文件和压缩,故而使用python脚本把这个工作实现了。使用配置文件的方式配置文件拷贝和移动的目录,基本能满足简单使用

How

  • 使用os.path 实现对文件和目录判断相关功能,如:os.path.abspath()/os.path.exists
  • 使用shutil模块实现对文件和文件夹的移动拷贝、删除,压缩
  • 使用configparser模块实现对ini配置文件的读取
  • 使用traceback的方法format_exc()打印捕捉到的异常
  • 使用pyinstaller将实现好功能的python文件打包成exe执行。

Code And ConfigFile

  • 功能实现文件CopyLogFile.py
# -*- 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,配置项对应功能如下
  1. SourceFiles源文件和目录,多个文件或目录以|分隔
  2. DestFolder目的路径,为空时再执行目录生成Log文件夹
  3. zipAndDel是否将拷贝后的文件夹压缩并删除
  4. 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
  1. 安装pyinstaller : pip install PyInstall ,安装成功后C:\Python36\Scripts目录下存在pyinstaller.exe程序
  2. 进入你的python的scripts目录下输入(其中-F指定打包后只生成一个exe格式的文件):
pyinstaller  -F  C:\CopyLogFile.py
  1. 等待运行结束,若没有错误,EXE文件会创建在python安装路径的Scripts文件夹中的dist文件夹内存在CopyLogFile.exe

End

你可能感兴趣的:(Python操作)