自己写的一个很简单的代码,需要拷贝的
from multiprocessing import Pool,Manager
import os
import time
def copyFileTask(name,oldFolderName,newFolderName,queue):
#print("---start-copy---")
queue.put(name)
fr = open(oldFolderName+"/"+name)
fw = open( newFolderName+"/"+name,"w")
#print("---start-copy_name---")
content = fr.read()
fw.write(content)
fr.close()
fw.close()
def main():
#o.获取文件夹的名字
oldFolderName = input("请输入您要拷贝的文件夹名:")
#1.创建一个文件夹
newFolderName = oldFolderName+"-复件"
#print(newFolderName)
os.mkdir(newFolderName)
print("创建文件夹成功!")
#2.获取old文件夹中所有的文件名
p = os.listdir(oldFolderName)
#print(p)
#3.使用多进程拷贝
pool = Pool(5)
queue = Manager().Queue()
for name in p:
pool.apply_async(copyFileTask,args=(name,oldFolderName,newFolderName,queue))
num = 0
allnum = len(p)
while True:
queue.get()
num += 1
copyRate = num/allnum
print("\rcopy的进度是:%.2f%%"%(copyRate*100),end="")
if num == allnum:
break
#pool.close()
#pool.join()
print("\n已完成copy!")
'''
time.sleep(3)
os.rmdir(newFolderName)
print("创建的复件文件夹已经删除")
'''
if __name__ == "__main__":
main()
'''bug
多次测试中有部分文件,只复制了文件名,内容没有复制,不知道原因
如果文件夹里有文件夹也不会拷贝里面的这个文件夹
'''
原文件非空,但是执行代码拷出来的文件会有部分是空的,不知原因,希望前辈指点
经过评论里前辈的指点,得到答案,在此感谢前辈的指教,下面记录下原因:
楼主我遇到了和你一样的问题,通过使用进程池的apply()方法发现了问题,因为在windows环境下,有些对文件的读写操作会使用gbk,这将导致无法读取,从而没有内容拷贝,想要解决的话有两种方法。1.比较简单的处理方法,就是在读取和写入文件的时候加入编码约束
-
old_file = open(old_folder + "\\" + file_name, "r", encoding="UTF-8")
-
new_file = open(new_folder + "\\" + file_name, "w", encoding="UTF-8")
2.比较通用的方法,就是把读取文件和写入文件都当成二进制数据来操作
-
old_file = open(old_folder + "\\" + file_name, "rb")
-
new_file = open(new_folder + "\\" + file_name, "wb")
经过测试此方法是正确的