您当前的位置: 首页 >  Python

庄小焱

暂无认证

  • 4浏览

    0关注

    800博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python——利用多进程来进行多文件复制

庄小焱 发布时间:2021-12-03 12:09:21 ,浏览量:4

摘要

在我能的日常开发中,很多的时候需要用到多线进程文件的复制,这样可以缩短拷贝的时间,本博文将利用python的多线程进行文件的拷贝进行演示和分析。

import multiprocessing
import os
import time

def copy_file(queue, file_name, source_folder_name, dest_folder_name):
    print('正在复制:%s' % file_name)
    if os.path.isdir(source_folder_name + '/' + file_name):
        queue.put(file_name)
        return
    if not os.path.exists(dest_folder_name):
        os.mkdir(dest_folder_name)
    data_file = open(source_folder_name + '/' + file_name, 'rb')
    cp_file = open(dest_folder_name + '/' + file_name, 'wb')
    while True:
        content = data_file.read(4096)
        if len(content) == 0:
            break
    cp_file.write(content)
    data_file.close()
    cp_file.close()
    print('%s文件复制完成!' % file_name)
    queue.put(file_name)

def copy(source_folder_name, dest_folder_name):
    if os.path.exists(dest_folder_name):
        if os.listdir(dest_folder_name) == None:
            print("当前文件夹已经存在,马上将清空……")
            os.removedirs(dest_folder_name)
    else:
        os.mkdir(dest_folder_name)
    file_names = os.listdir(source_folder_name)
    # 创建一个队里
    queue = multiprocessing.Manager().Queue(128)
    # 创建进程池
    p = multiprocessing.Pool(10)
    for file_name in file_names:
        print('put file_name %s' % file_name)
        p.apply_async(copy_file, args=(queue, file_name, source_folder_name, dest_folder_name))
    p.close()
    # p.join()
    all_file_nums = len(file_names)
    while True:
        file_name = queue.get()
        if file_name in file_names:
            file_names.remove(file_name)
        copy_rate = (all_file_nums - len(file_names)) * 100 / all_file_nums
        print("\r%.2f=========>(%s) (%0.2f/%0.2f)" % (copy_rate, file_name, len(file_names), all_file_nums) + " " * 50,
              end="")
        print("remaining: %s" % file_names)
        if copy_rate >= 100:
            break
    print('拷贝文件完成!')

def main():
    current_time = time.time()
    # 需要拷贝的文件所在的路径
    source_folder_name = "C:\\Users\\xjl\\Desktop\\课件"
    # 目标拷贝的文件路径
    dest_folder_name = "C:\\Users\\xjl\\Desktop\\target"
    copy(source_folder_name, dest_folder_name)
    print(time.time() - current_time)

if __name__ == "__main__":
    main()
测试结果

博文参考
关注
打赏
1657692014
查看更多评论
立即登录/注册

微信扫码登录

0.3431s