python 复制文件夹校验_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("復制進度.. %.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 复制文件夹校验_Python多任务复制文件夹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql5.6.37免安装_mysql
- 下一篇: envi插件大津法_IDL打开科学数据集