python的多进程拷贝文件(图片,txt,docx,目录等)

#使用多进程拷贝文件
#
#
import os
from multiprocessing import Pool,Manager
import winreg

#1.创建文件夹
new_file = None
new_pwd = None
def create_file():
    while True:
        new_name = input("请输入要创建的文件夹的路径和名字:")
        global new_file  # 添加全局变量作为下一个函数参数的传递
        global new_pwd
        new_file = new_name
        new_pwd = new_name
        if os.path.exists(new_name):
            print("路径有误,文件夹已经存在")
        else:
            break
    while True:
        is_create = input("请确认是否创建(请输入yes或no):")
        if is_create.upper() == "YES":
            os.mkdir(new_name)  # C:/Users/123/desktop/
            break
        elif is_create.upper() == "NO":
            print("成功退出")
            break
        else:
            print("输入错误,")


#2.获取旧文件夹里面的内容
old_filename = None
pwd = None
#dir_name = None
new_dir_name = None
def get_content():
    old_file = input("请输入旧的文件夹的路径和名字:")#oldfile = "C:/Users/123/desktop/4"
    global old_filename
    global pwd
    global new_pwd
    #global dir_name
    global old_name
    old_filename = old_file
    pwd = old_file
    file_content = os.listdir(old_file)
    for name in  file_content:#遍历文件名, 一个文件名分配一个进程去执行
        if os.path.isdir(pwd+"/"+name):#判读子级目录
            #dir_name = pwd + "/" + name
            dir_name = pwd + "/" + name
            new_dir_name = new_pwd + "/" + name
            #print(dir_name)
            file_content.remove(name)
            handle_dir_dir(dir_name,new_dir_name)#传递的是一个路径
        pool.apply_async(copy_file, (name,old_file,new_file,q))#多线程
        #old_file = old_file + "/" + dir_name
#----------------------------------因式传感器的目录有点小问题

def handle_dir_dir(dir_name, new_dir_name):
    dir_content = os.listdir(dir_name)  # 获取目录中文件名
    #print(dir_content)
    cp_dir_name = dir_name
    cp_new_dir_name = new_dir_name
    global pwd
    os.mkdir(new_dir_name)#创建文件夹
    for name in dir_content:
        if os.path.isdir(dir_name+"/"+name):
            #pwd = pwd + "/" + dir_name
            #os.mkdir(new_dir_name + "/" + name)
            pwd = dir_name+"/"+name#下一个文件夹的名字
            #new_pwd = old_name+"/"+name
            new_dir_name = new_dir_name + "/" + name#
            dir_content.remove(name)
            handle_dir_dir(pwd, new_dir_name)
        pool.apply_async(copy_file, (name, cp_dir_name, cp_new_dir_name, q))  # 多线程,把子级目录的内容copy



#3.对文件进行复制
def copy_file(name,old_file,new_file,q):
    num = len(os.listdir(old_file))#旧列表里面的元素个数
    fr = open(old_file+"/"+name,"rb")#读取旧文件夹里面的内容
    fw = open(new_file+"/"+name,"wb")#写入新文件夹里面的内容

    #读写文件内容
    while True:
        content = fr.read(1024)#一个字节一个字节地读取

        if len(content) == 0:
            break

        fw.write(content)

    fr.close()
    fw.close()

    q.put(name)

#4.展示文件复制的百分比
def show_progress():
    all_num = len(os.listdir(old_filename))
    num = 0
    while True:
        q.get()
        num += 1
        num_rate = num / all_num * 100
        print("\r文件复制的进度是:%.2f%%"%num_rate,end="")
        if num == all_num:
            break

if __name__ == '__main__':
    pool = Pool(5)#创建3个进程
    q = Manager().Queue()#设置多任务交互
    create_file()
    get_content()
    show_progress()
    # print(create_file().new_name)
    #print(new_file)
    pool.close()
    pool.join()


额,这个代码可以完成复制一个目录里面的图片,txt,docx等等(有的png图片可能不会复制,暂时不清楚原因),如果一个目录里面有多个子目录,也会进行复制,不过可能排序方面有些小问题,初次写这个,也没有加异常判断。比较粗浅,还请见谅。

效果展示:
python的多进程拷贝文件(图片,txt,docx,目录等)_第1张图片
python的多进程拷贝文件(图片,txt,docx,目录等)_第2张图片

(最后一张图里面本来是1,2,3,三个子级目录并列的,现在是1是2的父目录,2是3的父目录,这个bug以后应该修改的。)
python的多进程拷贝文件(图片,txt,docx,目录等)_第3张图片

你可能感兴趣的:(python,多进程)