多任务文件夹复制

高级编程技巧 学习笔记

一、多任务文件夹复制


1.1、简单实现

  1. 获取用户要复制的文件夹名字

  2. 创建一个新的文件夹

  3. 获取文件夹的所有待拷贝的文件名字

  4. 创建进程池

  5. 添加拷贝任务


import multiprocessing
import os


def copy_file(q, file_name, old_folder_name, new_folder_name):

    with open(old_folder_name + "/" + file_name, "rb") as f:
        content = f.read()

    with open(new_folder_name + "/" + file_name, "wb") as w:
        w.write(content)

    print(f"拷贝 {file_name} 文件完成!")
    q.put()


def main():
    # 获取要复制的文件夹名字
    old_folder_name = input("请输入要复制的文件夹名字: ")

    # 创建一个新文件夹
    new_folder_name = old_folder_name + " 备份"
    # 如果文件夹不存在则创建
    if not os.path.exists(new_folder_name):
        os.mkdir(new_folder_name)

    # 获取要复制文件夹的所有带拷贝的文件名字
    file_names = os.listdir(old_folder_name)
    # print(file_names)

    # 创建进程池、队列
    po = multiprocessing.Pool(5)
    q = multiprocessing.Manager().Queue()

    print("\n开始备份...\n")
    # 添加拷贝任务
    for file_name in file_names:
        po.apply_async(copy_file, args=(q, file_name, old_folder_name, new_folder_name))

    po.close()
    po.join()
    print("\n备份完成!\n")


if __name__ == '__main__':
    main()

1.2、添加进度条

  • 加一个循环输出进度

  • 怎么计算?(文件数量,已拷贝的文件的数量)

  • 退出条件(两个数量相对)

  • 使得打印输出更好看(使用 \r 使打印时光标回到起始位置)


import multiprocessing
import os
import time


def copy_file(q, file_name, old_folder_name, new_folder_name):

    # 读取文件
    with open(old_folder_name + "/" + file_name, "rb") as f:
        content = f.read()

    # 保存到新文件
    with open(new_folder_name + "/" + file_name, "wb") as w:
        w.write(content)

    # print(f"拷贝 {file_name} 文件完成!")
    q.put(file_name)


def main():
    # 获取要复制的文件夹名字
    old_folder_name = input("请输入要复制的文件夹名字: ")

    # 创建一个新文件夹
    new_folder_name = old_folder_name + " 备份"
    # 如果文件夹不存在则创建
    if not os.path.exists(new_folder_name):
        os.mkdir(new_folder_name)

    # 获取要复制文件夹的所有带拷贝的文件名字
    file_names = os.listdir(old_folder_name)
    # print(file_names)

    # 创建进程池、队列
    po = multiprocessing.Pool(5)
    q = multiprocessing.Manager().Queue()

    print("\n开始备份...\n")
    # 添加拷贝任务
    for file_name in file_names:
        po.apply_async(copy_file, args=(q, file_name, old_folder_name, new_folder_name))

    po.close()
    # po.join()

    file_count = len(file_names)
    copy_file_num = 0
    a = '>'
    while True:
        file_name = q.get()
        copy_file_num += 1

        if (copy_file_num%5==0) :
            a += '>'

        # print(f"\r拷贝的进度 {copy_file_num*100/file_count}%", end="")
        print("\r%s %f%%" % (a, copy_file_num*100/file_count), end="")
        time.sleep(0.05)

        if copy_file_num >= file_count:
            break

    print("\n\n备份完成!")


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值