python 关于文件夹拷贝器(多进程版)

该博客介绍了一个使用Python实现的多进程文件夹拷贝器。首先获取源文件夹,然后创建带有【副本】标识的目标文件夹,接着利用进程池处理文件复制。每个进程中,通过`copy_file`函数打开源文件并写入目标文件,同时使用`show_rate`函数实时显示拷贝进度。最后,遍历源文件夹中的所有文件,将拷贝任务分配给进程池,并在完成后关闭进程池。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"""实现思路
1.获取源文件
2.直接命名目标文件夹,在源文件夹加【副本】
3.创建目标文件夹
4.取得目标文件夹中的所有文件名
5.通过进程池处理文件夹拷贝文件
6.准备一个函数进行实现拷贝
7.关闭进程池,执行jion
8.显示拷贝进度
"""
import multiprocessing
import os

import time


def show_rate(file_names, queue):
    """ 显示进度
      1. 要拷贝文件总数
      2. 不断取得已经拷贝的文件数
      3. 不断显示进度
     """
    totle_file = len(file_names)
    current_copyed_nums = 0
    while True:
        copyed_file_name = queue.get()
        current_copyed_nums += 1
        print("当前进度%0.02f%%,当前正在拷贝的文件是%s" % (current_copyed_nums / totle_file * 100, copyed_file_name))
        if current_copyed_nums == totle_file:
            print("完成拷贝")
            break


def copy_file(file_name, source_folder_name, dest_folder_name, queue):
    """拷贝文件
         1. 打开要拷贝的文件
         2. 创建或者打开目标文件
         3. 读源文件内容
         4. 把源文件的内容写入到目标文件中
         5. 关闭源文件
         6. 关闭目标文件
    """
    read_file = open(source_folder_name + "/" + file_name, "rb")
    write_file = open(dest_folder_name + "/" + file_name, "wb")
    while True:
        time.sleep(1)
        content = read_file.read(1024)
        if content:
            write_file.write(content)
        else:
            break
    read_file.close()
    write_file.close()
    # 文件拷贝完毕
    queue.put(file_name)


def main():
    root_path = "/home/python/Desktop/"  # 文件夹根目录
    source_folder_name = root_path + input("请输入要拷贝的文件夹名:")
    dest_folder_name = source_folder_name + "[副本]"
    try:
        os.mkdir(dest_folder_name)
    except:
        pass
    file_names = os.listdir(source_folder_name)  # 取得文件夹中的所有文件名
    pool = multiprocessing.Pool()  #创建进程池
    queue = multiprocessing.Manager().Queue()  #创建进程列队
    for file_name in file_names:  # 遍历
        pool.apply_async(func=copy_file, args=(file_name, source_folder_name, dest_folder_name, queue))
    pool.close()
    # pool.join()  # 当需要显示进度时join要取消
    show_rate(file_names, queue)


if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值