有的时候文件太大,复制得很久,可以试试多进程复制,效率更高。
主要实现方法:os.walk获取文件夹下得所有文件路径。
通过文件路径拼接新得路径,然后通过文件路径读取文件,最后将读取得文件写入新的路径。
计算进度得函数,使用不换行打印进度,字符串前面加一个\r ,end=’’"即可不换行打印进度。
进程池通信用到得队列导出方法,multiprocessing.Manager().Queue()。注意首字母大写!
import multiprocessing
import os
import time
"""
主要实现步骤:
1.选择要复制的文件夹, 创建要复制的文件夹副本
2.遍历要复制的文件和文件夹, 获取所有子文件路径
3.复制文件到新创建的文件夹中
"""
def choose_file():
"""
选择你要复制的文件夹,并创建副本
:return: file
"""
file = input("输入你要复制的文件:")
while True:
if os.path.exists(file):
if os.path.exists(file+'-副本'):
break
os.mkdir(file+'-副本')
break
else:
file = input("文件不存在,重新输入:")
return file
def get_file_path(file):
"""
拼接根目录下的所有文件路径
:param file: 传入要复制的文件名
:return: paths
"""
# walk方法产生3元组 (dirpath, dirnames, filenames)
paths = list()
file_list = os.walk(file)
for files in file_list:
# 获取文件夹路径
paths.append(files[0])
for file in files[2]:
# 获取文件路径
path = files[0]+'\\'+file
paths.append(path)
return paths[1:]
def copy_file(q, path):
"""
复制文件
:param q: 队列
:param path: 原路径
:return: None
"""
# 拼接新的路径
new_path = path.split('\\')[0] + '-副本'
for i in path.split('\\')[1:]:
new_path += '\\'
new_path += i
# 判断是否为文件夹
if os.path.isfile(path):
with open(path, 'rb') as f:
content = f.read()
with open(new_path, 'wb') as f:
f.write(content)
else:
os.mkdir(new_path)
q.put(new_path)
def counter(q, paths):
num = 0
while True:
path = q.get()
num += 1
time.sleep(0.5)
print('\r当前进度:%d%%' % (num*100/len(paths)), end='')
if num*100/len(paths) >= 100:
break
def main():
# 创建队列
q = multiprocessing.Manager().Queue()
# 创建进程池
pool = multiprocessing.Pool(4)
# 获取要复制的文件名
file = choose_file()
# 获取文件夹下的文件路径
paths = get_file_path(file)
# 复制文件
for path in paths:
pool.apply_async(copy_file, args=(q, path))
pool.close()
# pool.join()
# 进度计算
counter(q, paths)
if __name__ == '__main__':
main()
实现效果: