Python实现的多进程拷贝文件并显示百分比功能示例


Posted in Python onApril 09, 2019

本文实例讲述了Python实现的多进程拷贝文件并显示百分比功能。分享给大家供大家参考,具体如下:

centos7下查看cup核数:

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

本示例拷贝文件采用的是最简单的但是有最复杂的方式:

1,根据要拷贝的文件夹名称,创建一个新的文件夹用来存储文件

2,读取源文件夹下的文件内容,将其写入目的文件夹下同名的文件中

直接上代码:

# coding=utf-8
from multiprocessing import Pool, Manager
import os
import traceback
import time
def copyFileTask(name, oldFolderName, newFolderName, queue):
  """copy文件"""
  fr = open(oldFolderName+"/"+name)
  fw = open(newFolderName+"/"+name, "w")
  content = fr.read()
  fw.write(content)
  fr.close()
  fw.close()
  # 将copy完成的文件名称put进队列
  queue.put(name)
def main():
  try:
    # 0. 获取要copy的文件夹
    # oldFolderName = input("请输入文件夹的名字:") # python3
    oldFolderName = raw_input("请输入文件夹的名字:") # python2
    # 1. 创建一个新的文件夹
    print 'mkdir new file ------'
    newFolderName = str(oldFolderName) + "-copy"
    # print(newFolderName)
    os.mkdir(newFolderName)
    # 2. 获取old文件夹中的所有的文件名字
    fileNames = os.listdir(oldFolderName)
    # print(fileNames)
    # 3. 使用多进程的方式copy 原文件夹中的所有文件到新的文件夹中
    pool = Pool(5)
    # 创建一个队列
    queue = Manager().Queue()
    for name in fileNames:
      pool.apply_async(copyFileTask, args=(name, oldFolderName, newFolderName, queue))
    pool.close() # 关闭进程池,不再接受请求
    pool.join() # 等待所有的子进程结束
    num = 0
    # 需要copy的文件总数
    allNum = len(fileNames)
    while num < allNum:
      # 收数据
      queue.get()
      num += 1
      copyRate = float(num) / allNum
      # 打印copy的进度
      time.sleep(0.1) # 容易看出来打印百分比的变化,延长百分比更新的时间
      print "\rcopy的进度是:%.2f%%" % (copyRate*100),
    print "\ncopy success ------"
  except:
    traceback.print_exc()
if __name__ == "__main__":
  main()

下面采用python模块shutil模块进行copy操作:

# coding=utf-8
from multiprocessing import Pool, Manager
import os
import traceback
import time
import shutil
def copyFileTask(name, old_path, new_path, queue):
  """copy文件"""
  src_path = os.path.join(old_path, name)
  dst_path = os.path.join(new_path, name)
  shutil.copy(src_path, dst_path) # 拷贝文件
  # shitil.move(src_path, dst_path) # 移动文件
  # 将copy完成的文件名称put进队列
  queue.put(name)
def main():
  try:
    # 0. 获取要copy的文件夹
    oldFolderName = raw_input("请输入文件夹的名字:")
    print '要拷贝的源文件夹: ', oldFolderName
    # 1. 创建一个新的文件夹
    newFolderName = raw_input("请输入文件夹的名字:")
    print '目标文件夹:', newFolderName
    # 获取当前所在的路径
    now_path = os.getcwd()
    print "当前所在路径: ", now_path
    old_path = os.path.join(now_path, oldFolderName)
    print '源文件夹路径: ', old_path
    new_path = os.path.join(now_path, newFolderName)
    print '目标文件夹路径: ', new_path
    if not os.path.exists(new_path):
      os.mkdir(new_path)
    # 3. 使用多进程的方式copy 原文件夹中的所有文件到新的文件夹中
    pool = Pool(5) # 创建5条进程
    queue = Manager().Queue() # 创建一个队列
    # 遍历源文件夹
    for root, dirs, files in os.walk(oldFolderName):
      """
      root 所指的是当前正在遍历的这个文件夹的本身的地址
      dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
      files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
      """
      print '源文件夹下的文件数量::', len(files)
      s_t = time.time()
      for file in files:
        pool.apply_async(copyFileTask, args=(file, old_path, new_path, queue)) # 向进程池中添加任务
      pool.close() # 关闭进程池,不再接受请求
      pool.join() # 等待所有的子进程结束
      print '耗时:{} 秒'.format(time.time() - s_t)
      num = 0
      # 需要copy的文件总数
      allNum = len(files)
      print 'len(fileNames) = ', allNum
      while True:
        # 收数据
        # print '收数据 ------'
        queue.get()
        # print 'queue.get() ------', queue.get()
        num += 1
        copyRate = float(num) / allNum
        # 打印copy的进度
        print "\rcopy的进度是:%.2f%%" % (copyRate*100),
        if num == allNum:
          break
    print "\ncopy success ------"
  except:
    traceback.print_exc()
if __name__ == "__main__":
  main()

输出:(由于我的cup核数为1核,在使用多进程的过程中,操作系统在轮询的时候,频繁的切换任务,浪费时间导致多进程比单进程耗时更长。)

[root@centos7 mnt]# python copy_file_test.py
请输入文件夹的名字:hdfs
要拷贝的源文件夹:  hdfs
请输入文件夹的名字:test01
目标文件夹: test01
当前所在路径:  /mnt
源文件夹路径:  /mnt/hdfs
目标文件夹路径:  /mnt/test01
源文件夹下的文件数量:: 8165
耗时:253.655323982 秒
len(fileNames) =  8165
copy的进度是:100.00%
copy success ------

单进程拷贝文件:

# coding=utf-8
from Queue import Queue
import os
import traceback
import time
import shutil
def copyFileTask(name, old_path, new_path, queue):
  """copy文件"""
  src_path = os.path.join(old_path, name)
  dst_path = os.path.join(new_path, name)
  shutil.copy(src_path, dst_path) # 拷贝文件
  # shitil.move(src_path, dst_path) # 移动文件
  # 将copy完成的文件名称put进队列
  queue.put(name)
def main():
  try:
    # 0. 获取要copy的文件夹
    oldFolderName = raw_input("请输入文件夹的名字:")
    print '要拷贝的源文件夹: ', oldFolderName
    # 1. 创建一个新的文件夹
    newFolderName = raw_input("请输入文件夹的名字:")
    print '目标文件夹:', newFolderName
    # 获取当前所在的路径
    now_path = os.getcwd()
    print "当前所在路径: ", now_path
    old_path = os.path.join(now_path, oldFolderName)
    print '源文件夹路径: ', old_path
    new_path = os.path.join(now_path, newFolderName)
    print '目标文件夹路径: ', new_path
    if not os.path.exists(new_path):
      os.mkdir(new_path)
    queue = Queue() # 创建一个队列
    # 遍历源文件夹
    for root, dirs, files in os.walk(oldFolderName):
      """
      root 所指的是当前正在遍历的这个文件夹的本身的地址
      dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
      files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
      """
      print '源文件夹下的文件数量::', len(files)
      s_t = time.time()
      # 调用函数拷贝文件
      for file in files:
        copyFileTask(file, old_path, new_path, queue)
      print '耗时:{} 秒'.format(time.time() - s_t)
      num = 0
      # 需要copy的文件总数
      allNum = len(files)
      print 'len(fileNames) = ', allNum
      while True:
        # 收数据
        # print '收数据 ------'
        queue.get()
        # print 'queue.get() ------', queue.get()
        num += 1
        copyRate = float(num) / allNum
        # 打印copy的进度
        print "\rcopy的进度是:%.2f%%" % (copyRate*100),
        if num == allNum:
          break
    print "\ncopy success ------"
  except:
    traceback.print_exc()
if __name__ == "__main__":
  main()

输出:

[root@centos7 mnt]# python copy_file_test_dan.py
请输入文件夹的名字:hdfs
要拷贝的源文件夹:  hdfs
请输入文件夹的名字:test02
目标文件夹: test02
当前所在路径:  /mnt
源文件夹路径:  /mnt/hdfs
目标文件夹路径:  /mnt/test02
源文件夹下的文件数量:: 8165
耗时:122.284090996 秒
len(fileNames) =  8165
copy的进度是:100.00%
copy success ------

我的虚拟机cpu核数:1

如下:

[root@centos7 mnt]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1
[root@centos7 mnt]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 1
[root@centos7 mnt]# cat /proc/cpuinfo| grep "processor"| wc -l
1

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
pymssql ntext字段调用问题解决方法
Dec 17 Python
python在windows下实现备份程序实例
Jul 04 Python
python判断图片宽度和高度后删除图片的方法
May 22 Python
Python中的条件判断语句与循环语句用法小结
Mar 21 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Nov 14 Python
Python常见的pandas用法demo示例
Mar 16 Python
django使用xadmin的全局配置详解
Nov 15 Python
Python实现ATM系统
Feb 17 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Django ValuesQuerySet转json方式
Mar 16 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 #Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 #Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 #Python
Python匿名函数及应用示例
Apr 09 #Python
用Python中的turtle模块画图两只小羊方法
Apr 09 #Python
python3实现表白神器
Apr 09 #Python
详解python配置虚拟环境
Apr 08 #Python
You might like
实用函数9
2007/11/08 PHP
PHP strtotime函数详解
2009/12/18 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实例之wxpython中Frame使用方法
2014/06/09 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
python如何使用代码运行助手
2020/07/03 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
小学教师办公室制度
2014/02/03 职场文书
教师个人自我评价范文
2014/04/13 职场文书
信息工作经验交流材料
2014/05/28 职场文书
员工工作表现自我评价
2015/03/06 职场文书
行政司机岗位职责
2015/04/10 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
opencv检测动态物体的实现
2021/07/21 Python