1. 程式人生 > >進程實現文件拷貝

進程實現文件拷貝

得到 args __main__ 詳細 時間 實現 ply 一起 pro

## 一、復制文件到當前目錄下
import os, sys
from multiprocessing import Pool
from multiprocessing import Manager

def copy_file(name, path, new_path, q):
fr = open(path + "/" + name)
fw = open(new_path + ‘/‘ + name, "w")
content = fr.read()
fw.write(content)
fr.close()
fw.close()
q.put(name)

def run():
path = input("請輸入您要拷貝的路徑:")
new_path = path + "-copy"
os.mkdir(new_path)
filename = os.listdir(path)
pool = Pool(5)
q = Manager().Queue()
for name in filename:
pool.apply_async(copy_file, args=(name, path, new_path, q))
num = 0
allnum = len(filename)
while num < allnum:
q.get()
num += 1
copyrate = int(num / allnum)
sys.stdout.write("\r 進度為:%.2f%%" % (copyrate * 100))
sys.stdout.flush()

if __name__ == ‘__main__‘:
run()


#######################################
### 二、進程實現拷貝
import multiprocessing,os
from multiprocessing import Manager

# 文件拷貝
def file_copy(file_name, file_dir, queue):
# 創建文件對象
fw = open(file_dir + ‘/‘ + file_name, ‘w‘)
fr = open(file_name)
while True:
# 讀取數據
file_data = fr.read(1024)
if file_data:
# 寫入數據
fw.write(file_data)
else:
fr.close()
fw.close()
# 每拷貝完成一個文件就添加一次
queue.put(file_name)
break

if __name__ == ‘__main__‘:
# 創建進程池
pool = multiprocessing.Pool(3)
# 輸入拷貝的文件路徑
file_path = input("請輸入文件路徑:")
# 獲取指定目錄下的文件列表
file_list = os.listdir(file_path)
# 請輸入要創建的文件夾
file_dir = input("請輸入要創建的文件夾路徑和名稱:")
os.mkdir(file_dir)
# 創建進程間通信
queue = Manager().Queue()
# 循環遍歷得到每一個文件
for file in file_list:
# 異步開啟進程池
pool.apply_async(file_copy, args=(file, file_dir, queue))
# 用來顯示拷貝進度
num = 0
while num < len(file_list):
# 用來記錄拷貝完成了多少文件
queue.get()
num += 1
# 計算百分比
result = num / len(file_list)
print(‘文件拷貝進度:%2.f%%‘ % (result * 100))
print("文件拷貝完成...")
# 關閉進程池
pool.close()
# 主進程等待子進程
pool.join()


#####################################
### 三、拷貝到任意位置
# 多任務可以說是多線程,多進程,即在同一時間可以完成多個任務。不管是在python開發過程中還是在其它開發過程中,多線程和多進程開發都是不可缺少的,這不僅僅可以大大提高軟件的執行效率,更能方便工具資源的管理。就並發和並行來說,並發不屬於多線/進程,並行屬於多線/進程。本文,通過使用線程池和消息隊列實現了多任務復制的功能以及復制完成百分比的輸入。一起來看看如何實現的吧。
# 首先:
# 為了創建線程池和消息隊列引入multiprocessing模塊
# 為了遍歷全部文件導入os模快
# import multiprocessing
# import os
# 然後:
# 對將要實現的功能進行分析
# 獲取要拷貝的文件夾名字
# 創建一個新的文件夾
# 獲取文件夾中所有待復制的文件
# 創建進程池
# 創建隊列
# 復制原文件夾中的文件復制到新文件夾中去

# 最後:
# 根據我們前期的分析,逐步實現我們的代碼,詳細代碼如下所示

import os
import multiprocessing


def copy_file(queue, filename, old_folder_name, new_folder_name):
# 以二進制形式打開文件
data = open(old_folder_name + "/" + filename, "rb")
# 讀取文件
temp = data.read()
data.close()

# 新建文件,寫入源文件內容
new_data = open(new_folder_name + "/" + filename, "wb")
new_data.write(temp)
new_data.close()
# 如果拷貝完一個文件就向隊列裏寫一個消息,表示已經完成
queue.put(filename)


def main():
# 1.獲取要拷貝的文件夾的名字
old_folder_name = input("請輸入要拷貝的文件夾的名字:")
# 2.創建一個新的文件夾(文件存在就pass,不存在就創建)
try:
new_folder_name = "D:\demo"
os.mkdir(new_folder_name)
except:
pass
# 3.獲取文件夾中所有的待copy的文件 os.listdir()
file_names = os.listdir(old_folder_name)
print(file_names)
# 4.創建進程池,多任務執行復制操作
po = multiprocessing.Pool(3)
# 5.創建隊列
queue = multiprocessing.Manager().Queue()
# 6.復制原文件夾中的文件到新的文件夾中
for i in file_names:
print("要拷貝的文件:%s" % i)
po.apply_async(copy_file, args=(queue, i, old_folder_name, new_folder_name))
po.close()
# 獲取所有文件的個數
all_files = len(file_names)
# 當前已完成文件個數
current_file = 0
while True:
# data = queue.get()
# print("已經完成:%s 文件的拷貝" % data) # 由於後面已經實現了復制完成的百分比,這裏註釋了
current_file += 1
print("\r拷貝的進度為:%.2f %%" % ((current_file / all_files) * 100), end="")
if current_file >= all_files:
break
print()

if __name__ == ‘__main__‘:
main()

進程實現文件拷貝