Python-多任务复制文件夹
import multiprocessing
import os
import time def copy_file(queue, file_name, old_folder_name, new_folder_name, count):
"""完成文件的复制"""
# 拼凑包含完整路径的文件(夹)
# os.path.join 把目录和文件名合成一个路径
old_file_name = os.path.join(old_folder_name, file_name)
new_file_name = new_folder_name + "/" + file_name
if os.path.isdir(old_file_name):
os.mkdir(new_folder_name + "/" + file_name)
f_names = os.listdir(old_file_name)
for f_name in f_names:
copy_file(queue, f_name, old_file_name, new_file_name, count)
# 进程池中出错,没有显示
# print("%s复制中...." % file_name)
else:
old_f = open(old_file_name, 'rb')
new_f = open(new_file_name, 'wb')
new_f.write(old_f.read())
old_f.close()
new_f.close()
count[0] += 1
# 如果拷贝完了文件,那么就向队列中写入一个消息,表示已经完成
queue.put(file_name) def get_files_num(top):
"""获取文件夹及子文件夹的个数"""
file_count = 0
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
file_count += 1
return file_count def rmdirs(top):
for root, dirs, files in os.walk(top, topdown=False):
# 先删除文件夹
for name in files:
os.remove(os.path.join(root, name))
# 再删除空目录
for name in dirs:
os.rmdir(os.path.join(root, name))
# for循环执行后top就为空目录
# 如果要删除将下面的注释打开
# os.rmdir(top) def main():
# 1 获取用户要copy的文件夹的名字
old_folder_name = input("请输入要复制的文件夹的名字:")
# 2 创建一个新的文件夹
try:
new_folder_name = old_folder_name + "[副本]"
os.mkdir(new_folder_name)
except:
# os.removedirs(new_folder_name)
# 先删除目录
rmdirs(new_folder_name)
# 3 获取文件夹所有的待copy的文件名字 listdir
file_names = os.listdir(old_folder_name)
# 4 创建进程池
pool = multiprocessing.Pool(5)
# 5 创建队列 显示复制的进度
queue = multiprocessing.Manager().Queue()
# 主进程与子进程共享这个List
count = multiprocessing.Manager().list([0])
# 6 向进程池中添加复制文件的任务
for file_name in file_names:
# 复制原文件夹中的文件, 到新文件夹中的文件去
pool.apply_async(copy_file, args=(queue, file_name, old_folder_name, new_folder_name, count))
# copy_file(queue, file_name, old_folder_name, new_folder_name, count)
pool.close()
pool.join()
# count[0] 要等到进程结束才有值
# 所有文件的长度
all_file_num = get_files_num(old_folder_name)
# 复制成功的长度
while True:
# file_name = queue.get()
# print("已经完成复制: %s " % file_name) # print(queue.qsize())
time.sleep(0.1)
print("\r复制进度.. %.2f%% " % (queue.qsize() * 100 / all_file_num), end="")
if all_file_num == queue.qsize():
print("")
exit()
# if all_file_num == count[0]:
# print("")
# exit() if __name__ == "__main__":
main()
这里使用两种方式来记录的进度
第一种:使用进程之间的共享变量
count = multiprocessing.Manager().list([0])
第二种:使用队列的方式来记录
# 创建队列
queue = multiprocessing.Manager().Queue() # 获取队列的长度
queue.qsize() # 入队列
queue.put()
注: 显示复制的进度未完善,即使加了延时
Python-多任务复制文件夹的更多相关文章
- JAVA实现复制文件夹
package com.filetest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...
- CMD复制文件夹
CMD复制文件夹 xcopy /E/I/Y "D:\GitHub\WIP\app" "D:\GitHub\WIP_server\html\webshell"
- Web 在线文件管理器学习笔记与总结(13)重命名文件夹(14)复制文件夹
(13)重命名文件夹 ① 重命名文件夹通过 rename($oldname,$newname) 实现 ② 检测文件夹名是否符合规范 ③ 检测当前目录中是否存在同名文件夹名称,如果不存在则重命名成功 i ...
- c# 封装的文件夹操作类之复制文件夹
c# 封装的文件夹操作类之复制文件夹 一.复制文件夹原理: 1.递归遍历文件夹 2.复制文件 二.FolderHelper.cs /// <summary> /// 文件夹操作类 /// ...
- java复制文件夹中的所有文件和文件夹到另一个文件夹中
1.复制文件夹 public static void copyDir(String oldPath, String newPath) throws IOException { File file = ...
- Python新建/删除文件夹
新建以当前日期为名的文件夹 import datetime,os,shutil today = datetime.datetime.now().date().strftime('%Y%m%d') pa ...
- PHP复制文件夹及文件夹内的文件
//1.取被复制的文件夹的名字://2.写出新的文件夹的名字://3.调用此函数,将旧.新文件夹名字作为参数传递://4.如需复制文件夹内的文件,第三个参数传1,否则传0: public functi ...
- linux cp 复制文件夹
复制文件夹需要添加 -r 或 -R 参数(recursive: 递归的:循环的) 如 cp -r DIR_A DIR_B; 同理,rm 也一样. 如 rm -r DIR_B
- java复制文件夹及所有子目录和文件
package text; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; im ...
- C# 压缩 解压 复制文件夹,文件的操作
命名空间:namespace System.IO.Compression 压缩: //目标文件夹 string fileDirPath = "/Downloads/试题" + us ...
随机推荐
- oi笔记——抽象的深度优先搜索
oi笔记--抽象的深度优先搜索 例题: \(N个数中选K个数,选出的和要为sum\) 例题分析: 对于每个点,我们可以按"选"和"不选"进行搜索,如图: 或者0 ...
- 微信获得access_token
<?php //获取access_token $appid = 'wx47a6fc3c1187e60d'; //测试账号appid $appsecret = '525f76d57c7bd7200 ...
- Consul集群版容器化部署与应用集成
背景 由于公司目前的主要产品使用的注册中心是consul,consul需要用集群来保证高可用,传统的方式(Nginx/HAProxy)会有单点故障问题,为了解决该问题,我开始研究如何只依赖consul ...
- [Algo] 118. Array Deduplication IV
Given an unsorted integer array, remove adjacent duplicate elements repeatedly, from left to right. ...
- ubuntu19.10安装cuda-10.1
ubuntu19.10安装cuda-10.1 1.安装N卡驱动: 打开ubuntu的软件和更新,设置N卡驱动 2.查看ubuntu显卡驱动 nvidia-smi 显示: Sun Feb 23 06:4 ...
- swoole使用异步redis
1.lnmp安装redis拓展 wget http://download.redis.io/releases/redis-4.0.9.tar.gz chmod 755 redis-4.0.9.tar. ...
- 控制台输出<迷你DVD管理>
使用顺序.选择.循环.跳转语句 数组 功能实现菜单显示和切换 输入的数字不符合要求直接退出程序 用户可以选择新增.查看. 删除.借出.归还.退出 思路分析 使用switch语句实现菜单选择 使用do- ...
- [思路笔记]WEB安全之漏洞挖掘
记录自己在实际渗透测试以及漏洞挖掘中会用到的思路和方法.不断完善,尽量以系统的方式展现程序化式的漏洞挖掘.由于各种原因,不便公开. 通用策略 1.信息搜集 : 数据挖掘.业务挖掘 数据: 邮箱.手机号 ...
- 编码,基础数据类型 int str bool,for循环
一.编码: ASCII: 8位 1个字节 其实是7位,首位全部是0,创造者留出一位,以便后续使用; gdk : 16位 2个字节 国标码 只能识别汉语和英语 英语:8位 1个字节 汉语 ...
- python学习笔记(27)-unittest单元测试-测试用例
单元测试 #单元测试 #unittest+接口 unittest python自带 pytest+jenkins+allure #接口测试的本质 就是测试类里面的函数 #单元测试的本质 测试函数 代码 ...