高级编程技巧 学习笔记
一、多任务文件夹复制
1.1、简单实现
-
获取用户要复制的文件夹名字
-
创建一个新的文件夹
-
获取文件夹的所有待拷贝的文件名字
-
创建进程池
-
添加拷贝任务
import multiprocessing
import os
def copy_file(q, file_name, old_folder_name, new_folder_name):
with open(old_folder_name + "/" + file_name, "rb") as f:
content = f.read()
with open(new_folder_name + "/" + file_name, "wb") as w:
w.write(content)
print(f"拷贝 {file_name} 文件完成!")
q.put()
def main():
# 获取要复制的文件夹名字
old_folder_name = input("请输入要复制的文件夹名字: ")
# 创建一个新文件夹
new_folder_name = old_folder_name + " 备份"
# 如果文件夹不存在则创建
if not os.path.exists(new_folder_name):
os.mkdir(new_folder_name)
# 获取要复制文件夹的所有带拷贝的文件名字
file_names = os.listdir(old_folder_name)
# print(file_names)
# 创建进程池、队列
po = multiprocessing.Pool(5)
q = multiprocessing.Manager().Queue()
print("\n开始备份...\n")
# 添加拷贝任务
for file_name in file_names:
po.apply_async(copy_file, args=(q, file_name, old_folder_name, new_folder_name))
po.close()
po.join()
print("\n备份完成!\n")
if __name__ == '__main__':
main()
1.2、添加进度条
-
加一个循环输出进度
-
怎么计算?(文件数量,已拷贝的文件的数量)
-
退出条件(两个数量相对)
-
使得打印输出更好看(使用
\r
使打印时光标回到起始位置)
import multiprocessing
import os
import time
def copy_file(q, file_name, old_folder_name, new_folder_name):
# 读取文件
with open(old_folder_name + "/" + file_name, "rb") as f:
content = f.read()
# 保存到新文件
with open(new_folder_name + "/" + file_name, "wb") as w:
w.write(content)
# print(f"拷贝 {file_name} 文件完成!")
q.put(file_name)
def main():
# 获取要复制的文件夹名字
old_folder_name = input("请输入要复制的文件夹名字: ")
# 创建一个新文件夹
new_folder_name = old_folder_name + " 备份"
# 如果文件夹不存在则创建
if not os.path.exists(new_folder_name):
os.mkdir(new_folder_name)
# 获取要复制文件夹的所有带拷贝的文件名字
file_names = os.listdir(old_folder_name)
# print(file_names)
# 创建进程池、队列
po = multiprocessing.Pool(5)
q = multiprocessing.Manager().Queue()
print("\n开始备份...\n")
# 添加拷贝任务
for file_name in file_names:
po.apply_async(copy_file, args=(q, file_name, old_folder_name, new_folder_name))
po.close()
# po.join()
file_count = len(file_names)
copy_file_num = 0
a = '>'
while True:
file_name = q.get()
copy_file_num += 1
if (copy_file_num%5==0) :
a += '>'
# print(f"\r拷贝的进度 {copy_file_num*100/file_count}%", end="")
print("\r%s %f%%" % (a, copy_file_num*100/file_count), end="")
time.sleep(0.05)
if copy_file_num >= file_count:
break
print("\n\n备份完成!")
if __name__ == '__main__':
main()