多进程复制文件

有的时候文件太大,复制得很久,可以试试多进程复制,效率更高。
主要实现方法:os.walk获取文件夹下得所有文件路径。
通过文件路径拼接新得路径,然后通过文件路径读取文件,最后将读取得文件写入新的路径。
计算进度得函数,使用不换行打印进度,字符串前面加一个\r ,end=’’"即可不换行打印进度。
进程池通信用到得队列导出方法,multiprocessing.Manager().Queue()。注意首字母大写!

import multiprocessing
import os
import time

"""
主要实现步骤:
1.选择要复制的文件夹, 创建要复制的文件夹副本
2.遍历要复制的文件和文件夹, 获取所有子文件路径
3.复制文件到新创建的文件夹中
"""


def choose_file():
    """
    选择你要复制的文件夹,并创建副本
    :return: file
    """
    file = input("输入你要复制的文件:")

    while True:
        if os.path.exists(file):
            if os.path.exists(file+'-副本'):
                break
            os.mkdir(file+'-副本')
            break
        else:
            file = input("文件不存在,重新输入:")

    return file

def get_file_path(file):
    """
    拼接根目录下的所有文件路径
    :param file: 传入要复制的文件名
    :return: paths
    """
    # walk方法产生3元组 (dirpath, dirnames, filenames)
    paths = list()
    file_list = os.walk(file)

    for files in file_list:
        # 获取文件夹路径
        paths.append(files[0])
        for file in files[2]:
            # 获取文件路径
            path = files[0]+'\\'+file
            paths.append(path)

    return paths[1:]

def copy_file(q, path):
    """
    复制文件
    :param q: 队列
    :param path: 原路径
    :return: None
    """
    # 拼接新的路径
    new_path = path.split('\\')[0] + '-副本'
    for i in path.split('\\')[1:]:
        new_path += '\\'
        new_path += i

    # 判断是否为文件夹
    if os.path.isfile(path):
        with open(path, 'rb') as f:
            content = f.read()

        with open(new_path, 'wb') as f:
            f.write(content)
    else:
        os.mkdir(new_path)

    q.put(new_path)

def counter(q, paths):
    num = 0
    while True:

        path = q.get()
        num += 1
        time.sleep(0.5)

        print('\r当前进度:%d%%' % (num*100/len(paths)), end='')

        if num*100/len(paths) >= 100:
            break

def main():
    # 创建队列
    q = multiprocessing.Manager().Queue()
    # 创建进程池
    pool = multiprocessing.Pool(4)
    # 获取要复制的文件名
    file = choose_file()
    # 获取文件夹下的文件路径
    paths = get_file_path(file)
    # 复制文件
    for path in paths:
        pool.apply_async(copy_file, args=(q, path))

    pool.close()
    # pool.join()
    # 进度计算
    counter(q, paths)


if __name__ == '__main__':
    main()

实现效果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值