本文来源吾爱破解论坛
本帖最后由 山野村夫-陈墨 于 2019-11-5 14:47 编辑
其实写这个帖子主要是练习一下多进程通信编程的,比较基础的一段程序,
方便以后回头再看。
注释写得比较详细了,这儿就不赘述了。
[Python] 纯文本查看 复制代码
''' 多进程实现复制文件 步骤: (1)获得源文件夹路径; (2)获取源文件夹下各文件的文件名 (3)获得目标文件夹 (4)复制文件 知识点: (1)os模块: 1>listdir(path),得到路径path下的所有文件夹名和文件名。(只有一层) 2>mkdir(path),新建该路径的文件夹 (2)multiprocess 多进程 1>Pool() 进程池 2>Manger().Queue() 队列(进程通信) 2019年10月22日 ''' import multiprocessing import os import time #1得到复制的文件夹名 def get_old_folder_name(): old_folder_name = input("请输入复制目录:") return old_folder_name #2得到文件夹下的文件名 def get_file_names( folder ): file_names = os.listdir(folder) return file_names #3新建文件夹 def creat_folder(): new_folder_name = input("请输入新的文件夹名:") try: os.mkdir(new_folder_name) except: pass return new_folder_name #4复制文件到指定文件夹下 def copy_file(file_name, old_folder_name, new_folder_name,queue): try: #不知道文件类型,直接使用二进制读取。 old_f = open(old_folder_name+"/"+file_name, "rb") read_str = old_f.read() old_f.close() new_f = open(new_folder_name +"/" + file_name, "wb") new_f.write(read_str) new_f.close() except: pass #避免”复制“文件夹而产生的文件数量不够,程序不能结束 queue.put(1) #time.sleep(1)没有实际作用,只是为了看进度条的效果 time.sleep(1) #5主函数 def main(queue): old_folder_name = get_old_folder_name() print("原文件夹: ",old_folder_name) file_names = get_file_names(old_folder_name) print("文件数量: ",len(file_names)) new_folder_name = creat_folder() print("新文件夹: ",new_folder_name) for item in file_names : pool.apply_async(copy_file, (item,old_folder_name,new_folder_name ,queue)) pool.close() file_num = 0 file_sum = len(file_names) while True: if not queue.empty(): queue.get() file_num+=1 print("\r",end="") print("▓"*int(file_num/file_sum *50), end="") print(" 已完成 %.2f%%" % (file_num/file_sum*100), end="") if file_num == file_sum: print() break print("复制完成!") #5函数入口 if __name__ == "__main__": pool = multiprocessing.Pool(5) queue = multiprocessing.Manager().Queue() main(queue)
现在的问题是,如果文件夹下面还有文件夹,那么这个文件夹下的数据是无法复制的,这个问题暂时留下了,日后再更吧 !
/******************************************************************************************************************************************************************************************************/
今天刚好没有课,顺便把昨天遗留的问题解决--这次可以复制一个文件夹下的所有文件了。
在这次更新中,新添加了以下内容:
[Python] 纯文本查看 复制代码
#4复制文件到指定文件夹下 def copy_file(file_name, old_folder_name, new_folder_name,queue): try: #如果是文件,进行复制 if os.path.isfile( old_folder_name+"/"+file_name): #不知道文件类型,直接使用二进制读取。 old_f = open(old_folder_name+"/"+file_name, "rb") read_str = old_f.read() old_f.close() new_f = open(new_folder_name +"/" + file_name, "wb") new_f.write(read_str) new_f.close() #如果是文件夹,进行递归。 新建文件夹--》获取子文件夹文件名--》复制文件 if os.path.isdir(old_folder_name+"/"+file_name): new_folder_name = creat_folder(new_folder_name+"/"+file_name) old_folder_name = old_folder_name +"/"+file_name file_names = get_file_names(old_folder_name) for file_name in file_names : copy_file(file_name, old_folder_name, new_folder_name, queue) except: pass #避免”复制“文件夹而产生的文件数量不够,程序不能结束 queue.put(1) #time.sleep(1)没有实际作用,只是为了看进度条的效果 time.sleep(1)
完整的程序附上:
[Python] 纯文本查看 复制代码
''' 多进程实现复制文件 步骤: (1)获得源文件夹路径; (2)获取源文件夹下各文件的文件名 (3)获得目标文件夹 (4)复制文件(文件夹不能复制) 新增内容: 复制一个文件夹下的所有文件 知识点: (1)os模块: 1>listdir(path),得到路径path下的所有文件夹名和文件名。(只有一层) 2>mkdir(path),新建该路径的文件夹 3>path.isdir(path),该路径是否为文。是,返回true 4>path.isfile(path), 该路径是否为文件。 是,返回true。 (2)multiprocess 多进程 1>Pool() 进程池 2>Manger().Queue() 队列(进程通信) (3)递归实现复制子文件夹下的文件。 2019年10月23日 ''' import multiprocessing import os import time #1得到复制的文件夹名 def get_old_folder_name(): old_folder_name = input("请输入复制目录:") return old_folder_name #2得到文件夹下的文件名 def get_file_names( folder ): file_names = os.listdir(folder) return file_names #3新建文件夹 def creat_folder(new_folder_name): try: os.mkdir(new_folder_name) except: pass return new_folder_name #4复制文件到指定文件夹下 def copy_file(file_name, old_folder_name, new_folder_name,queue): try: #如果是文件,进行复制 if os.path.isfile( old_folder_name+"/"+file_name): #不知道文件类型,直接使用二进制读取。 old_f = open(old_folder_name+"/"+file_name, "rb") read_str = old_f.read() old_f.close() new_f = open(new_folder_name +"/" + file_name, "wb") new_f.write(read_str) new_f.close() #如果是文件夹,进行递归。 新建文件夹--》获取子文件夹文件名--》复制文件 if os.path.isdir(old_folder_name+"/"+file_name): new_folder_name = creat_folder(new_folder_name+"/"+file_name) old_folder_name = old_folder_name +"/"+file_name file_names = get_file_names(old_folder_name) for file_name in file_names : copy_file(file_name, old_folder_name, new_folder_name, queue) except: pass #避免”复制“文件夹而产生的文件数量不够,程序不能结束 queue.put(1) #time.sleep(1)没有实际作用,只是为了看进度条的效果 time.sleep(1) #5主函数 def main(queue): old_folder_name = get_old_folder_name() print("原文件夹: ",old_folder_name) file_names = get_file_names(old_folder_name) print("文件数量: ",len(file_names)) new_folder_name = input("请输入新的文件夹名:") new_folder_name = creat_folder( new_folder_name) print("新文件夹: ",new_folder_name) for item in file_names : pool.apply_async(copy_file, (item,old_folder_name,new_folder_name ,queue)) pool.close() file_num = 0 file_sum = len(file_names) while True: if not queue.empty(): queue.get() file_num+=1 print("\r",end="") print("▓"*int(file_num/file_sum *50), end="") print(" 已完成 %.2f%%" % (file_num/file_sum*100), end="") if file_num == file_sum: print() break print("复制完成!") #5函数入口 if __name__ == "__main__": pool = multiprocessing.Pool(10) queue = multiprocessing.Manager().Queue() main(queue)
/
版权声明:
本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。
- 上一篇: 【原创】【Python】二十多行代码,实现MP4文件批量转码成MP3
- 下一篇: 自己写的工时计算脚本