Python 多进程复制文件夹

介绍 :

复制一个文件夹里的所有文件(不含文件夹) , 到新文件夹里 .
_ps : 此文件里不要再有文件夹 _

注意: 这只是一个进程的练习 , 如果你的需求是文件里还有文件夹 , 点击 : 递归复制文件夹

创建一个新文件夹 , 在定义一个函数(copy_file)复制文件内容 , 把复制的文件放到新文件夹里 . 创建一个进程池 , 把复制文件的任务添加到进程池里(目的是为了练习进程) , 在创建一个进程队列,用来记录复制文件的进度 .

import multiprocessing
import os
import shutil
import time


def copy_file(file_name, source_folder_name, dest_folder_name, queue):
    # 源文件路径
    source_path = source_folder_name + '/' + file_name
    # 目标文件路径
    dest_path = dest_folder_name + '/' + file_name

    # 打开源文件
    with open(source_path, 'rb') as f_read:
        # 打开目标文件夹
        with open(dest_path, 'wb') as f_write:
            # 从源文件读取
            while True:
                time.sleep(0.01)
                content = f_read.read(1024)
                if content:
                    # 写到新的文件
                    f_write.write(content)
                else:
                    # 把完成的文件名字传入队列
                    queue.put(file_name)
                    break


def main():
    # 1用户输入要copy的文件夹名字
    source_folder_name = input('输入要copy的文件夹名字')
    # 2生成目标文件夹的名字 = 原文件夹名字+[副本]
    dest_folder_name = source_folder_name + '[副本]'
    # 3判断目标文件夹是否存在
    if os.path.exists(dest_folder_name):
        # 4如果存在就删除
        shutil.rmtree(dest_folder_name)
    # 5创建目标文件夹
    os.mkdir(dest_folder_name)
    # 6获取文件夹里所有的文件名字
    file_names = os.listdir(source_folder_name)

    # 定义一个进程池对象
    pool = multiprocessing.Pool(3)
    # 进程池的队列
    queue = multiprocessing.Manager().Queue()

    # 7遍历所有文件名字
    for file_name in file_names:
        # 8一个一个copy,把任务扔到进程池
        pool.apply_async(copy_file, args=(file_name, source_folder_name, dest_folder_name, queue))

    # 9打印进度
    pool.close()

    all_file_num = len(file_names)
    while True:
        # 从队列获取完成的文件名字
        file_name = queue.get()
        if file_name in file_names:
            file_names.remove(file_name)

        copy_rate = (all_file_num - len(file_names)) * 100 / all_file_num
        print("\r%.2f...(%s)" % (copy_rate, file_name) + " " * 50, end="")
        if copy_rate >= 100:
            break

    # 等待进程池结束
    pool.join()
    print('over')


if __name__ == '__main__':
    main()

一个进程池里同时有三个进程 , 就是同时复制三个文件, 在最后添加了一个类似进度天的效果 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值