Python----使用程序池實現多檔案複製並顯示進度條
阿新 • • 發佈:2021-05-06
Python----使用程序池實現多檔案複製並顯示進度條
- 主程序向程序池新增copy檔案的內容
- 程序池實現copy
- 通過設定一個訊息佇列用來實現主程序與子程序的通訊,來顯示進度條
#!/usr/bin/env python
# coding=utf-8
import os
import multiprocessing
def copy_file(q, file_name, old_folder_name, new_folder_name):
"""完成檔案複製"""
# print("=====>模擬copy檔案:從%s----->到%s 檔名是:%s" % (old_folder_name, new_folder_name, file_name))
old_f = open(old_folder_name + "/" + file_name,"rb")
content = old_f.read()
old_f.close()
new_f = open(new_folder_name + "/" + file_name, "wb")
new_f.write(content)
new_f.close()
#如果copy結束,就向佇列中寫入一個訊息,表示已經完成
q.put(file_name)
def main():
# 1. 獲取使用者要copy資料夾的名字
old_folder_name = input("please input copy_folder_name:")
# 2. 建立一個新的資料夾
try:
new_folder_name = old_folder_name + "[復件]"
os.mkdir(old_folder_name + "[復件]")
except:
pass
# 3. 獲取資料夾中所有帶copy檔案的名字 listdir()
file_names = os.listdir(old_folder_name)
# print(file_names)
# 4. 建立程序池
po = multiprocessing.Pool(5)
# 5. 建立一個佇列
q = multiprocessing.Manager().Queue()
# 6. 向程序池中新增copy檔案的任務
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()
# 測一下所有檔案個數
all_file_num = len(file_names)
copy_complete_num = 0
while True:
file_name = q.get()
#print("已經完成copy:%s" % file_name)
copy_complete_num += 1
print("\r拷貝進度為: %.2f %%" % (copy_complete_num*100/all_file_num),end="")
if copy_complete_num >= all_file_num:
break
print()
if __name__ == "__main__":
main()