介绍 :
复制一个文件夹里的所有文件(不含文件夹) , 到新文件夹里 .
_ps : 此文件里不要再有文件夹 _
注意: 这只是一个进程的练习 , 如果你的需求是文件里还有文件夹 , 点击 : 递归复制文件夹
创建一个新文件夹 , 在定义一个函数(copy_file)复制文件内容 , 把复制的文件放到新文件夹里 . 创建一个进程池 , 把复制文件的任务添加到进程池里(目的是为了练习进程) , 在创建一个进程队列,用来记录复制文件的进度 .
import multiprocessing
import os
import shutil
import time
def copy_file(file_name, source_folder_name, dest_folder_name, queue):
# 源文件路径
source_path = source_folder_name + '/' + file_name
# 目标文件路径
dest_path = dest_folder_name + '/' + file_name
# 打开源文件
with open(source_path, 'rb') as f_read:
# 打开目标文件夹
with open(dest_path, 'wb') as f_write:
# 从源文件读取
while True:
time.sleep(0.01)
content = f_read.read(1024)
if content:
# 写到新的文件
f_write.write(content)
else:
# 把完成的文件名字传入队列
queue.put(file_name)
break
def main():
# 1用户输入要copy的文件夹名字
source_folder_name = input('输入要copy的文件夹名字')
# 2生成目标文件夹的名字 = 原文件夹名字+[副本]
dest_folder_name = source_folder_name + '[副本]'
# 3判断目标文件夹是否存在
if os.path.exists(dest_folder_name):
# 4如果存在就删除
shutil.rmtree(dest_folder_name)
# 5创建目标文件夹
os.mkdir(dest_folder_name)
# 6获取文件夹里所有的文件名字
file_names = os.listdir(source_folder_name)
# 定义一个进程池对象
pool = multiprocessing.Pool(3)
# 进程池的队列
queue = multiprocessing.Manager().Queue()
# 7遍历所有文件名字
for file_name in file_names:
# 8一个一个copy,把任务扔到进程池
pool.apply_async(copy_file, args=(file_name, source_folder_name, dest_folder_name, queue))
# 9打印进度
pool.close()
all_file_num = len(file_names)
while True:
# 从队列获取完成的文件名字
file_name = queue.get()
if file_name in file_names:
file_names.remove(file_name)
copy_rate = (all_file_num - len(file_names)) * 100 / all_file_num
print("\r%.2f...(%s)" % (copy_rate, file_name) + " " * 50, end="")
if copy_rate >= 100:
break
# 等待进程池结束
pool.join()
print('over')
if __name__ == '__main__':
main()
一个进程池里同时有三个进程 , 就是同时复制三个文件, 在最后添加了一个类似进度天的效果 .