吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3279|回复: 11
收起左侧

[Python 转载] python多进程实现复制文件

[复制链接]
山野村夫-陈墨 发表于 2019-10-22 22:54
本帖最后由 山野村夫-陈墨 于 2019-11-5 14:47 编辑

其实写这个帖子主要是练习一下多进程通信编程的,比较基础的一段程序,
方便以后回头再看。
注释写得比较详细了,这儿就不赘述了。
[Python] 纯文本查看 复制代码
'''
        多进程实现复制文件
    步骤:
        (1)获得源文件夹路径;
        (2)获取源文件夹下各文件的文件名
        (3)获得目标文件夹
        (4)复制文件

    知识点:
        (1)os模块:
            1>listdir(path),得到路径path下的所有文件夹名和文件名。(只有一层)
            2>mkdir(path),新建该路径的文件夹
        (2)multiprocess 多进程
            1>Pool()   进程池
            2>Manger().Queue()  队列(进程通信)


         2019年10月22日
'''


import multiprocessing
import os
import time
#1得到复制的文件夹名
def get_old_folder_name():
    old_folder_name =  input("请输入复制目录:")
    return old_folder_name


#2得到文件夹下的文件名
def get_file_names( folder ):
     file_names = os.listdir(folder)
     return file_names


#3新建文件夹
def creat_folder():
    new_folder_name = input("请输入新的文件夹名:")
    try:
        os.mkdir(new_folder_name)
    except:
        pass
    return  new_folder_name


#4复制文件到指定文件夹下
def copy_file(file_name, old_folder_name, new_folder_name,queue):
    try:
        #不知道文件类型,直接使用二进制读取。
        old_f = open(old_folder_name+"/"+file_name, "rb")
        read_str = old_f.read()
        old_f.close()

        new_f = open(new_folder_name +"/" + file_name, "wb")
        new_f.write(read_str)
        new_f.close()
    except:
        pass
    #避免”复制“文件夹而产生的文件数量不够,程序不能结束
    queue.put(1)
    #time.sleep(1)没有实际作用,只是为了看进度条的效果
    time.sleep(1)

#5主函数
def  main(queue):
    old_folder_name = get_old_folder_name()
    print("原文件夹: ",old_folder_name)
    file_names =  get_file_names(old_folder_name)
    print("文件数量: ",len(file_names))
    new_folder_name = creat_folder()
    print("新文件夹:  ",new_folder_name)
    for  item in file_names :
        pool.apply_async(copy_file, (item,old_folder_name,new_folder_name ,queue))

    pool.close()
    file_num = 0
    file_sum = len(file_names)
    while True:
        if not queue.empty():
            queue.get()
            file_num+=1
            print("\r",end="")
            print("▓"*int(file_num/file_sum *50), end="")
            print("  已完成 %.2f%%" % (file_num/file_sum*100), end="")
        if file_num == file_sum:
            print()
            break
    print("复制完成!")

#5函数入口
if __name__ == "__main__":
    pool  = multiprocessing.Pool(5)
    queue = multiprocessing.Manager().Queue()

    main(queue)



现在的问题是,如果文件夹下面还有文件夹,那么这个文件夹下的数据是无法复制的,这个问题暂时留下了,日后再更吧 !


/******************************************************************************************************************************************************************************************************/
今天刚好没有课,顺便把昨天遗留的问题解决--这次可以复制一个文件夹下的所有文件了。

在这次更新中,新添加了以下内容:
[Python] 纯文本查看 复制代码
#4复制文件到指定文件夹下
def copy_file(file_name, old_folder_name, new_folder_name,queue):
    try:
        #如果是文件,进行复制
        if  os.path.isfile( old_folder_name+"/"+file_name):
            #不知道文件类型,直接使用二进制读取。
            old_f = open(old_folder_name+"/"+file_name, "rb")
            read_str = old_f.read()
            old_f.close()

            new_f = open(new_folder_name +"/" + file_name, "wb")
            new_f.write(read_str)
            new_f.close()

        #如果是文件夹,进行递归。 新建文件夹--》获取子文件夹文件名--》复制文件
        if os.path.isdir(old_folder_name+"/"+file_name):
            new_folder_name = creat_folder(new_folder_name+"/"+file_name)
            old_folder_name = old_folder_name +"/"+file_name
            file_names  =  get_file_names(old_folder_name)
            for  file_name in file_names :
                 copy_file(file_name, old_folder_name, new_folder_name, queue)
    except:
        pass
    #避免”复制“文件夹而产生的文件数量不够,程序不能结束
    queue.put(1)
    #time.sleep(1)没有实际作用,只是为了看进度条的效果
    time.sleep(1)


完整的程序附上:
[Python] 纯文本查看 复制代码
'''
        多进程实现复制文件
    步骤:
        (1)获得源文件夹路径;
        (2)获取源文件夹下各文件的文件名
        (3)获得目标文件夹
        (4)复制文件(文件夹不能复制)

    新增内容:
            复制一个文件夹下的所有文件


    知识点:
        (1)os模块:
            1>listdir(path),得到路径path下的所有文件夹名和文件名。(只有一层)
            2>mkdir(path),新建该路径的文件夹
            3>path.isdir(path),该路径是否为文。是,返回true
            4>path.isfile(path), 该路径是否为文件。 是,返回true。
        (2)multiprocess 多进程
            1>Pool()   进程池
            2>Manger().Queue()  队列(进程通信)

        (3)递归实现复制子文件夹下的文件。

         2019年10月23日
'''


import multiprocessing
import os
import time
#1得到复制的文件夹名
def get_old_folder_name():
    old_folder_name =  input("请输入复制目录:")
    return old_folder_name


#2得到文件夹下的文件名
def get_file_names( folder ):
     file_names = os.listdir(folder)
     return file_names

#3新建文件夹
def creat_folder(new_folder_name):
    try:
        os.mkdir(new_folder_name)
    except:
        pass
    return  new_folder_name


#4复制文件到指定文件夹下
def copy_file(file_name, old_folder_name, new_folder_name,queue):
    try:
        #如果是文件,进行复制
        if  os.path.isfile( old_folder_name+"/"+file_name):
            #不知道文件类型,直接使用二进制读取。
            old_f = open(old_folder_name+"/"+file_name, "rb")
            read_str = old_f.read()
            old_f.close()

            new_f = open(new_folder_name +"/" + file_name, "wb")
            new_f.write(read_str)
            new_f.close()

        #如果是文件夹,进行递归。 新建文件夹--》获取子文件夹文件名--》复制文件
        if os.path.isdir(old_folder_name+"/"+file_name):
            new_folder_name = creat_folder(new_folder_name+"/"+file_name)
            old_folder_name = old_folder_name +"/"+file_name
            file_names  =  get_file_names(old_folder_name)
            for  file_name in file_names :
                 copy_file(file_name, old_folder_name, new_folder_name, queue)
    except:
        pass
    #避免”复制“文件夹而产生的文件数量不够,程序不能结束
    queue.put(1)
    #time.sleep(1)没有实际作用,只是为了看进度条的效果
    time.sleep(1)

#5主函数
def  main(queue):
    old_folder_name = get_old_folder_name()
    print("原文件夹: ",old_folder_name)

    file_names =  get_file_names(old_folder_name)
    print("文件数量: ",len(file_names))

    new_folder_name = input("请输入新的文件夹名:")
    new_folder_name = creat_folder( new_folder_name)
    print("新文件夹:  ",new_folder_name)

    for  item in file_names :
        pool.apply_async(copy_file, (item,old_folder_name,new_folder_name ,queue))

    pool.close()
    file_num = 0
    file_sum = len(file_names)
    while True:
        if not queue.empty():
            queue.get()
            file_num+=1
            print("\r",end="")
            print("▓"*int(file_num/file_sum *50), end="")
            print("  已完成 %.2f%%" % (file_num/file_sum*100), end="")
        if file_num == file_sum:
            print()
            break
    print("复制完成!")

#5函数入口
if __name__ == "__main__":
    pool  = multiprocessing.Pool(10)
    queue = multiprocessing.Manager().Queue()
    main(queue)



/

免费评分

参与人数 6吾爱币 +6 热心值 +5 收起 理由
Estonteco + 1 + 1 用心讨论,共获提升!
回首天涯 + 1 + 1 谢谢@Thanks!
IMRE + 1 + 1 用心讨论,共获提升!
yjingjie + 1 + 1 楼主数学不好能学吗
Jamesstrange + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
岚瑟 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

shubiao 发表于 2019-10-23 06:31
谢谢分享
zhangbice 发表于 2019-10-24 09:07
cj13888 发表于 2019-10-24 09:49
zzrvv 发表于 2019-10-24 12:11
标记收藏了。。借鉴学习。谢谢分享
Romela_love2017 发表于 2019-10-27 21:13
谢谢分享,正在学习
shlboliqiao 发表于 2019-11-12 12:36
谢谢分享,正需要多文件复制
peskin 发表于 2019-11-12 12:43
谢谢分享,最近正在看相关内容
marione 发表于 2019-11-15 12:10
收藏备查
csp0227 发表于 2019-11-15 12:22
先来学习了,感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 17:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表