Python 实现自动复制文件_V1.1.5

发布时间 2024-01-09 16:06:09作者: 小钟学编程

Python 实现自动复制文件_V1.1.5
一:需求
从某目录索引其所有文件夹文件,若包含某特定字符串的文件。拷贝至指定文件
可以每次设置多个源目录,及对应的目标目录和指定字符串
筛选日期,设置除符合特定字符串外,文件创建日期小于某数值,比如3天
复制源目录文件夹结构至目标目录
二:事前准备
Python导入依赖库:

import configparser
import itertools
import logging
import os
import shutil
import datetime
from datetime import timedelta
import chardet

三:开发:
1.创建配置文件,用于填写三个数据:源目录,目标目录,指定字符串,可多对,以‘|’间隔。特定字符串允许一个,或与源目录,目标目录数量一致

[Directories]
source_directories = D:\12013275| D:\EDGE下载|D:\相关
destination_directories = D:\logs1|D:\logs2|D:\logs3
[Search]
search_strings = 2023|5646|c

2.主文件:数据初始化,索引查询文件,拷贝文件,日志记录
2.1创建ProgramInitialization函数(方法),用于初始化需要的数据,并将数据变量设置为全局变量global.

def ProgramInitialization():
    global current_directory,today_day,log_dst_path,timestamp_two_days_ago,one_month_ago_str
    current_directory = os.getcwd()
    today_day = datetime.datetime.now().strftime('%Y-%m-%d')
    log_dst_path = os.path.join(current_directory, "log")
    os.makedirs(log_dst_path, exist_ok=True)
    logFile = os.path.join(log_dst_path, 'Copy_File' + today_day + '.log')
    logging.basicConfig(filename=logFile, level=logging.DEBUG, format='%(asctime)s %(levelname)s: %(message)s')
    # 计算两天前的时间戳
    two_days_ago = datetime.datetime.now() - timedelta(days=2)
    timestamp_two_days_ago = int(two_days_ago.timestamp())
    today = datetime.datetime.now()
    one_month_ago_str = (today - datetime.timedelta(days=30)).strftime('%Y-%m-%d')

2.2创建find_and_copy_files函数(方法),用于查询源目录及其子文件夹,索引符合条件的文件,拷贝至目标路径

def find_and_copy_files(src_dir, dst_dir, search_str):
    # 确保源目录和目标目录都存在
    if not os.path.exists(src_dir):
        msg = f"源目录 {src_dir} 不存在!"
        logging.info(msg)
        print(msg)
        return
    if not os.path.exists(dst_dir):
        os.makedirs(dst_dir)
        # 遍历源目录中的所有文件和子目录
    for root, dirs, files in os.walk(src_dir):
        for file in files:
            # 检查文件名是否包含搜索字符串
            if search_str in file:
                # 构建源文件的完整路径
                src_file = os.path.join(root, file)
                # 获取文件的创建时间戳
                ctime = os.path.getctime(src_file)
                # 检查文件是否在最近两天内创建
                if ctime > timestamp_two_days_ago:
                    # 构建目标文件的完整路径
                    a = root.split(src_dir)[1]
                    b = dst_dir + a
                    if not os.path.exists(b):
                        os.makedirs(b)
                    dst_file = os.path.join(b, file)
                    # 复制文件
                    shutil.copy2(src_file, dst_file)
                    # 记录日志并打印消息
                    msg = f"文件 {src_file} 已复制到 {dst_file}"
                    logging.info(msg)
                    print(msg)

2.3创建run函数(方法),用于程序连接,运行

def run():
    ProgramInitialization()
    msg = '读取配置文件config2.ini'
    logging.info(msg)
    print(msg)
    # 读取配置文件
    with open('config2.ini', 'rb') as f:
        result = chardet.detect(f.read())  # 检测文件编码
    with open('config2.ini', 'r', encoding = str(result['encoding'])) as f:
        config = configparser.ConfigParser()
        config.read_file(f)
    # 从配置文件中获取源目录、目标目录和特定字符串
    # 获取源路径列表和目标路径列表、获取搜索字符串列表
    source_directories =  [dir_path.strip() for dir_path in config.get('Directories', 'source_directories').split('|')]
    destination_directories = [dir_path.strip() for dir_path in config.get('Directories', 'destination_directories').split('|')]
    search_strings =  [s.strip() for s in config.get('Search', 'search_strings').split('|')]
    msg = f'获取源路径列表:{source_directories},\n目标路径列表:{destination_directories},\n特定字符串列表:{search_strings}'
    logging.info(msg)
    print(msg)
    # 确保源路径、目标路径和搜索字符串的长度相同
    if len(source_directories) != len(destination_directories) or ( len(source_directories) != len(search_strings) and len(search_strings) != 1):
        msg = f"源路径、目标路径和搜索字符串的数量必须相等,或搜索字符串列表长度为1"
        logging.info(msg)
        print(msg)
        exit(1)
    msg = f'运行find_and_copy_files,检索文件,复制文件'
    logging.info(msg)
    print(msg)
    # 如果搜索字符串只有一个,则循环使用它来与多个源路径和目标路径配对
    if len(search_strings) == 1:
        search_strings = itertools.cycle([search_strings[0]])
    for src, dst, search in zip(source_directories, destination_directories, search_strings):
        find_and_copy_files(src, dst, search)
    Remove_Log()

2.4执行程序:

try:
    run()
    msg = '程序运行成功'
    logging.info(msg)
    print(msg)
except Exception as e:
    msg = f'程序运行失败:{e}'
    logging.info(msg)
    print(msg)