os实现文件的读写操作
mulitprocessing 创建进程对象
threading 创建线程对象
要想进行文件的复制,那么我们先来了解一下如何进行文件的读写操作。就好像我们手动复制一个文件一样,第一步打开这个文件,读取这个文件的每一行,最后关闭这个文件。
# 我们将写好的读写文件封装成一个函数,实现了文件的复制功能。方便以后调用。
# rpath可以是要进行复制的源文件或者路径
# wpath 是要写入的文件(目标文件)或路径
def copyFile(rPath,wPath):
# 以二进制读的方式打开一个文件或路径
fr = open(rPath,"rb")
# 以二进制写的文件打开一个文件或路径
fw = open(wPath,"wb")
# 读取打开的文件fr内容,将内容赋值给context
context = fr.read()
# 将context的内容写入到fw文件中
fw.write(context)
# 关闭文件
fr.close()
fw.close()
# r代表忽略大小写
path = r"C:\Users\Champion\Desktop\学习代码" # 路径
topath = r"C:\Users\Champion\Desktop\copyText"
# path = r"C:\Users\Champion\Desktop\学习代码\copyDemo.txt" # 文件
# topath = r"C:\Users\Champion\Desktop\copyText\copyDemo.txt"
读path路径下的所有文件
fileList = os.listdir(path)
for循环处理每个文件 进行拷贝
for fileName in fileList:
copyFile(os.path.join(path,fileName),os.path.join(topath,fileName))
接下来使用多进程的方式来进行文件的拷贝。
为哈要使用多进程?多进程也就意味着多任务,会提高运行效率。
比如说我们要进行一个1GB文件的复制,通过单进程的模式我们复制大约需要30s。
但是我们如果通过多进程比如说四个进程同时来进行文件的拷贝,大约需要十几秒。
如果你发现通过两种方式复制文件的效率差不多,甚至通过多线程的方式花费时间还要更久一点,那么只有一个问题,就是你的文件不够大。手动滑稽0.0.0.0…0…00
import os,time
from multiprocessing import Process,Pool
import threading
# 拷贝单个文件
# arguments包 可以进行传参
def copyFile(rPath,wPath):
fr = open(rPath,"rb")
fw = open(wPath,"wb")
context = fr.read()
fw.write(context)
fr.close()
fw.close()
path = r"C:\Users\Champion\Desktop\学习代码"
topath = r"C:\Users\Champion\Desktop\copyText"
# path = r"C:\Users\Champion\Desktop\学习代码\copyDemo.txt"
# topath = r"C:\Users\Champion\Desktop\copyText\copyDemo.txt"
'''
# 实现单进程的文件拷贝
# 读path路径下的所有文件
fileList = os.listdir(path)
# for循环处理每个文件 进行拷贝
for fileName in fileList:
copyFile(os.path.join(path,fileName),os.path.join(topath,fileName))
'''
# 多进程拷贝 文件夹下的所有文件
if __name__ == "__main__":
fileList = os.listdir(path)
# 创建进程池 统一管理进程池中的进程
pp = Pool(2)
for fileName in fileList:
# 创建进程
pp.apply_async(copyFile,args=(os.path.join(path,fileName),os.path.join(topath,fileName)))
pp.close()
pp.join()
print("主进程结束")
'''
# 单线程拷贝文件
if __name__ == "__main__":
print("主线程%s启动"%(threading.current_thread()))
start = time.time()
p = threading.Thread(target=copyFile,name="copy",args=(path,topath))
print("子线程%s启动"%(threading.Thread.name))
p.start()
p.join()
end = time.time()
# time.sleep(2)
print("子线程%s拷贝结束,共耗时%.2fs"%(threading.Thread.name,(end-start))) # 3.41s
# p.join()
print("主线程%s结束"%(threading.current_thread()))
'''