普通批量拷贝文件

import os

import shutil

import logging

from logging import handlers

from colorama import Fore, Style, init

import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(BASE_DIR) # 加入环境变量

from utils.time_utils import run_time

from conf import settings

class Colorlog(object):

"""

记录日志,添加颜色

"""

init(autoreset=True) # 初始化,并且设置颜色设置自动恢复

# 根据信息不同设置不同的颜色格式

info_color = Fore.GREEN + Style.BRIGHT

warn_color = Fore.YELLOW + Style.BRIGHT

debug_color = Fore.MAGENTA + Style.BRIGHT

error_color = Fore.RED + Style.BRIGHT

def __init__(self, name):

# 日志格式

log_format = '[%(asctime)s - %(levelname)s - %(name)s ] %(message)s '

self.logger = logging.getLogger(name)

self.logger.setLevel(settings.LOG_LEVEL)

console_handler = logging.StreamHandler()

# 文件绝对路径

logfile_path = os.path.join(settings.LOG_DIR, "log", settings.LOG_FILE)

if not os.path.exists(logfile_path):

# 创建log目录

os.mkdir(os.path.join(settings.LOG_DIR, "log"))

# 每天创建一个日志文件,文件数不超过20个

file_handler = handlers.TimedRotatingFileHandler(

logfile_path, when="D", interval=1, backupCount=20)

self.logger.addHandler(console_handler)

self.logger.addHandler(file_handler)

file_format = logging.Formatter(fmt=log_format)

console_format = logging.Formatter(

fmt=log_format, datefmt='%Y-%m-%d %H:%M:%S ')

console_handler.setFormatter(console_format)

file_handler.setFormatter(file_format)

def warn(self, message):

self.logger.warning(Colorlog.warn_color + message)

def info(self, message):

self.logger.info(Colorlog.info_color + message)

def error(self, message):

self.logger.error(Colorlog.info_color + message)

def debug(self, message):

self.logger.debug(Colorlog.info_color + message)

cp_log = Colorlog("cp")

def copy_file(local_file_path, dst_file_path):

size = bytes2human(os.path.getsize(local_file_path))

# cp_log.debug(

# 'copy file {} to {}, file size {}'.format(

# local_file_path, dst_file_path, size))

shutil.copy(local_file_path, dst_file_path) # copy file

@run_time

def upload_file(src_path, dst_path):

"""

上传文件

:param src_path:

:param dst_path:

:return:

"""

cp_log.info('upload_file %s %s' % (src_path, dst_path))

# 目标目录是否存在,不存在则创建

if not os.path.exists(dst_path):

os.makedirs(dst_path)

cp_log.info('Create Dest Dir %s' % dst_path)

# 判断是否为目录,存在则把文件拷贝到目标目录下

if os.path.isdir(src_path):

all_file_nums = 0

for root, dirs, files in os.walk(src_path):

# 遍历目录下所有文件根,目录下的每一个文件夹(包含它自己),

# 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名称】

for f in files:

local_file_path = os.path.join(root, f) # 本地文件路径 如/src/q.txt

dst_file_path = os.path.abspath(

local_file_path.replace(

src_path, dst_path)) # 目标文件路径 如/dst/q.txt

dst_dir = os.path.dirname(dst_file_path) # 目标文件路径文件夹 如/dst/

if not os.path.isdir(dst_dir):

os.makedirs(dst_dir) # 创建目录

cp_log.debug('Create Dest Dir %s' % dst_path)

copy_file(local_file_path, dst_file_path) # 拷贝文件

cp_log.info('copy file {} complete '.format(local_file_path))

all_file_nums += 1

cp_log.info(

'copy all files complete , files count = {}'.format(all_file_nums))

else:

cp_log.warn('Dir is not exists %s' % dst_path)

def bytes2human(n):

symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')

prefix = {}

for i, s in enumerate(symbols):

# << 左移” 左移一位表示乘2 即1 << 1=2,二位就表示4 即1 << 2=4,

# 10位就表示1024 即1 << 10=1024 就是2的n次方

prefix[s] = 1 << (i + 1) * 10

for s in reversed(symbols):

if n >= prefix[s]:

value = float(n) / prefix[s]

return '%.1f%s' % (value, s)

return "%sBytes" % n

if __name__ == '__main__':

src = 'D://test1'

dst = 'D://copytest2'

upload_file(src, dst)

输出结果

[2018-06-29 15:14:04 - INFO - cp ] upload_file D://test1 D://copytest2

[2018-06-29 15:14:04 - INFO - cp ] Create Dest Dir D://copytest2

[2018-06-29 15:14:04 - DEBUG - cp ] Create Dest Dir D://copytest2

[2018-06-29 15:14:04 - INFO - cp ] copy file D://test1\20180601\20180601_test.txt complete

[2018-06-29 15:14:04 - DEBUG - cp ] Create Dest Dir D://copytest2

[2018-06-29 15:14:19 - INFO - cp ] copy file D://test1\20180601\wmv\01文件操作和异常.wmv.pbb complete

[2018-06-29 15:14:19 - DEBUG - cp ] Create Dest Dir D://copytest2

[2018-06-29 15:14:19 - INFO - cp ] copy file D://test1\20180602\20180602_test.txt complete

……

[2018-06-29 15:16:20 - INFO - cp ] copy file D://test1\Tesseract-OCR\tessdata\tessconfigs\nobatch complete

[2018-06-29 15:16:20 - INFO - cp ] copy file D://test1\Tesseract-OCR\tessdata\tessconfigs\segdemo complete

[2018-06-29 15:16:20 - INFO - cp ] copy all files complete , files count = 164

[2018-06-29 15:16:20 - DEBUG - runtime - time_utils.py - decor- 59 ] func {upload_file} run { 135.2727}s

使用多线程批量拷贝文件

#!/usr/bin/python

# -*- coding: utf-8 -*-

# @Time : 2018/6/29 10:28

# @Author : hyang

# @File : batch_copy.py

# @Software: PyCharm

import os

import shutil

import logging

from logging import handlers

from colorama import Fore, Style, init

from multiprocessing.dummy import Pool as ThreadPool

import queue

import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(BASE_DIR) # 加入环境变量

from utils.time_utils import run_time

from conf import settings

class Colorlog(object):

"""

记录日志,添加颜色

"""

init(autoreset=True) # 初始化,并且设置颜色设置自动恢复

# 根据信息不同设置不同的颜色格式

info_color = Fore.GREEN + Style.BRIGHT

warn_color = Fore.YELLOW + Style.BRIGHT

debug_color = Fore.MAGENTA + Style.BRIGHT

error_color = Fore.RED + Style.BRIGHT

def __init__(self, name):

# 日志格式

log_format = '[%(asctime)s - %(levelname)s - %(name)s ] %(message)s '

self.logger = logging.getLogger(name)

self.logger.setLevel(settings.LOG_LEVEL)

console_handler = logging.StreamHandler()

# 文件绝对路径

logfile_path = os.path.join(settings.LOG_DIR, "log", settings.LOG_FILE)

if not os.path.exists(logfile_path):

# 创建log目录

os.mkdir(os.path.join(settings.LOG_DIR, "log"))

# 每天创建一个日志文件,文件数不超过20个

file_handler = handlers.TimedRotatingFileHandler(

logfile_path, when="D", interval=1, backupCount=20)

self.logger.addHandler(console_handler)

self.logger.addHandler(file_handler)

file_format = logging.Formatter(fmt=log_format)

console_format = logging.Formatter(

fmt=log_format, datefmt='%Y-%m-%d %H:%M:%S ')

console_handler.setFormatter(console_format)

file_handler.setFormatter(file_format)

def warn(self, message):

self.logger.warning(Colorlog.warn_color + message)

def info(self, message):

self.logger.info(Colorlog.info_color + message)

def error(self, message):

self.logger.error(Colorlog.info_color + message)

def debug(self, message):

self.logger.debug(Colorlog.info_color + message)

cp_log = Colorlog("cp")

def copy_file(local_file_path, dst_file_path, q):

size = bytes2human(os.path.getsize(local_file_path))

# cp_log.debug(

# 'copy file {} to {}, file size {}'.format(

# local_file_path, dst_file_path, size))

shutil.copy(local_file_path, dst_file_path) # copy file

q.put(local_file_path) # 加入队列

@run_time

def upload_file(src_path, dst_path):

"""

上传文件

:param src_path:

:param dst_path:

:return:

"""

pool = ThreadPool(3) # 开启3个线程

q = queue.Queue() # 开启一个队列

cp_log.info('upload_file %s %s' % (src_path, dst_path))

# 目标目录是否存在,不存在则创建

if not os.path.exists(dst_path):

os.makedirs(dst_path)

cp_log.info('Create Dest Dir %s' % dst_path)

# 判断是否为目录,存在则把文件拷贝到目标目录下

if os.path.isdir(src_path):

all_file_nums = 0

for root, dirs, files in os.walk(src_path):

# 遍历目录下所有文件根,目录下的每一个文件夹(包含它自己),

# 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名称】

for f in files:

all_file_nums += 1

local_file_path = os.path.join(root, f) # 本地文件路径 如/src/q.txt

dst_file_path = os.path.abspath(

local_file_path.replace(

src_path, dst_path)) # 目标文件路径 如/dst/q.txt

dst_dir = os.path.dirname(dst_file_path) # 目标文件路径文件夹 如/dst/

if not os.path.isdir(dst_dir):

os.makedirs(dst_dir) # 创建目录

cp_log.debug('Create Dest Dir %s' % dst_path)

pool.apply_async(

func=copy_file, args=(

local_file_path, dst_file_path, q))

pool.close() # close()执行后不会有新的进程加入到pool

# pool.join() # join函数等待所有子进程结束

print('all_file_nums ', all_file_nums)

num = 0

while True:

if not q.empty():

item = q.get()

cp_log.info('copy file {} complete '.format(item))

num += 1

copy_rate = float(num / all_file_nums) * 100

cp_log.warn("\r 进度为:%.2f%%" % copy_rate)

if int(copy_rate) >= 100:

break

cp_log.info(

'copy all files complete , files count = {}'.format(all_file_nums))

else:

cp_log.warn('Dir is not exists %s' % dst_path)

def bytes2human(n):

symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')

prefix = {}

for i, s in enumerate(symbols):

# << 左移” 左移一位表示乘2 即1 << 1=2,二位就表示4 即1 << 2=4,

# 10位就表示1024 即1 << 10=1024 就是2的n次方

prefix[s] = 1 << (i + 1) * 10

for s in reversed(symbols):

if n >= prefix[s]:

value = float(n) / prefix[s]

return '%.1f%s' % (value, s)

return "%sBytes" % n

if __name__ == '__main__':

src = 'D://test1'

dst = 'D://copy_thread_test2'

upload_file(src, dst)

输出结果

[2018-06-29 15:26:13 - INFO - cp ] copy file D://test1\20180601\20180601_test.txt complete

进度为:0.61%

[2018-06-29 15:26:13 - INFO - cp ] copy file D://test1\20180602\20180602_test.txt complete

进度为:1.22%

[2018-06-29 15:26:13 - INFO - cp ] copy file D://test1\20180602\教程目录及说明.txt complete

进度为:1.83%

all_file_nums 164

[2018-06-29 15:26:15 - INFO - cp ] copy file D://test1\20180602\MongoDB权威指南(中文版).pdf complete

进度为:2.44%

[2018-06-29 15:26:15 - INFO - cp ] copy file D://test1\ibooks\AIX_HACMP_40pages.pdf complete

进度为:3.05%

……

[2018-06-29 15:29:02 - INFO - cp ] copy file D://test1\Tesseract-OCR\tessdata\tessconfigs\nobatch complete

进度为:99.39%

[2018-06-29 15:29:02 - INFO - cp ] copy file D://test1\Tesseract-OCR\tessdata\tessconfigs\segdemo complete

进度为:100.00%

[2018-06-29 15:29:02 - INFO - cp ] copy all files complete , files count = 164

[2018-06-29 15:29:02 - DEBUG - runtime - time_utils.py - decor- 59 ] func {upload_file} run { 168.7767}s

使用协程批量拷贝文件

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

from gevent import monkey;monkey.patch_all()

import os

import shutil

import logging

import time

from functools import wraps

from logging import handlers

from colorama import Fore, Style, init

from multiprocessing.pool import ThreadPool

import queue

import gevent

import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(BASE_DIR) # 加入环境变量

class Colorlog(object):

"""

记录日志,添加颜色

"""

init(autoreset=True) # 初始化,并且设置颜色设置自动恢复

# 根据信息不同设置不同的颜色格式

info_color = Fore.GREEN + Style.BRIGHT

warn_color = Fore.YELLOW + Style.BRIGHT

debug_color = Fore.MAGENTA + Style.BRIGHT

error_color = Fore.RED + Style.BRIGHT

def __init__(self, name):

# 日志格式

log_format = '[%(asctime)s - %(levelname)s - %(name)s ] %(message)s '

self.logger = logging.getLogger(name)

self.logger.setLevel(logging.DEBUG)

console_handler = logging.StreamHandler()

# 文件绝对路径

logfile_path = 'test.log'

# 每天创建一个日志文件,文件数不超过20个

file_handler = handlers.TimedRotatingFileHandler(

logfile_path, when="D", interval=1, backupCount=20)

self.logger.addHandler(console_handler)

self.logger.addHandler(file_handler)

file_format = logging.Formatter(fmt=log_format)

console_format = logging.Formatter(

fmt=log_format, datefmt='%Y-%m-%d %H:%M:%S ')

console_handler.setFormatter(console_format)

file_handler.setFormatter(file_format)

def warn(self, message):

self.logger.warning(Colorlog.warn_color + message)

def info(self, message):

self.logger.info(Colorlog.info_color + message)

def error(self, message):

self.logger.error(Colorlog.info_color + message)

def debug(self, message):

self.logger.debug(Colorlog.info_color + message)

cp_log = Colorlog("cp")

def run_time(func):

"""

计算程序运行时间的装饰器

:param func:

:return:

"""

@wraps(func)

def decor(*args, **kwargs):

start = time.time()

res = func(*args, **kwargs)

end = time.time()

print("func {%s} run {%10.4f}s " % (func.__name__, (end - start)))

return res

return decor

def copy_file(local_file_path, dst_file_path):

# size = bytes2human(os.path.getsize(local_file_path))

# cp_log.debug(

# 'copy file {} to {}, file size {}'.format(

# local_file_path, dst_file_path, size))

shutil.copy(local_file_path, dst_file_path) # copy file

cp_log.info(

'copy file {} , size= {} complete '.format(

local_file_path, bytes2human(

os.path.getsize(dst_file_path))))

def getdirsize(dir):

"""

获得文件夹中所有文件大小

:param dir:

:return:

"""

size = 0

for root, dirs, files in os.walk(dir):

size += sum([os.path.getsize(os.path.join(root, name))

for name in files])

return bytes2human(size)

@run_time

def upload_file(src_path, dst_path):

"""

上传文件

:param src_path:

:param dst_path:

:return:

"""

cp_log.info('upload_file %s %s' % (src_path, dst_path))

# 目标目录是否存在,不存在则创建

if not os.path.exists(dst_path):

os.makedirs(dst_path)

cp_log.info('Create Dest Dir %s' % dst_path)

tasklist = [] # 任务列表

# 判断是否为目录,存在则把文件拷贝到目标目录下

if os.path.isdir(src_path):

all_file_nums = 0

all_file_size = getdirsize(src_path)

cp_log.info('all_file_size = %s' % all_file_size)

for root, dirs, files in os.walk(src_path):

# 遍历目录下所有文件根,目录下的每一个文件夹(包含它自己),

# 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名称】

for f in files:

all_file_nums += 1

local_file_path = os.path.join(root, f) # 本地文件路径 如/src/q.txt

dst_file_path = os.path.abspath(

local_file_path.replace(

src_path, dst_path)) # 目标文件路径 如/dst/q.txt

dst_dir = os.path.dirname(dst_file_path) # 目标文件路径文件夹 如/dst/

if not os.path.isdir(dst_dir):

os.makedirs(dst_dir) # 创建目录

cp_log.debug('Create Dest Dir %s' % dst_dir)

tasklist.append(

gevent.spawn(

copy_file,

local_file_path,

dst_file_path)) # 开启协程

gevent.joinall(tasklist) # 阻塞等待所有操作都执行完毕

print('all_file_nums ', all_file_nums)

cp_log.info(

'copy all files complete , files count = {} , size = {}'.format(all_file_nums, getdirsize(dst_path)))

else:

cp_log.warn('Dir is not exists %s' % dst_path)

def bytes2human(n):

symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')

prefix = {}

for i, s in enumerate(symbols):

# << 左移” 左移一位表示乘2 即1 << 1=2,二位就表示4 即1 << 2=4,

# 10位就表示1024 即1 << 10=1024 就是2的n次方

prefix[s] = 1 << (i + 1) * 10

for s in reversed(symbols):

if n >= prefix[s]:

value = float(n) / prefix[s]

return '%.1f%s' % (value, s)

return "%sB" % n

if __name__ == '__main__':

src = 'C://pythonStudy/python爬虫参考资料'

dst = 'C://pythonStudy/copy_thread_test2'

upload_file(src, dst)

输出结果

"C:\Program Files\Python36\python.exe" batch_copy.py

[2018-06-29 22:50:22 - INFO - cp ] upload_file C://pythonStudy/python爬虫参考资料 C://pythonStudy/copy_thread_test2

[2018-06-29 22:50:22 - INFO - cp ] Create Dest Dir C://pythonStudy/copy_thread_test2

[2018-06-29 22:50:22 - INFO - cp ] all_file_size = 620.6M

[2018-06-29 22:50:22 - DEBUG - cp ] Create Dest Dir C:\pythonStudy\copy_thread_test2\python-scraping-master

[2018-06-29 22:50:22 - DEBUG - cp ] Create Dest Dir C:\pythonStudy\copy_thread_test2\python-scraping-master\chapter1

[2018-06-29 22:50:22 - DEBUG - cp ] Create Dest Dir C:\pythonStudy\copy_thread_test2\python-scraping-master\chapter10

[2018-06-29 22:50:22 - DEBUG - cp ] Create Dest Dir

……

[2018-06-29 22:50:23 - INFO - cp ] copy file C://pythonStudy/python爬虫参考资料\python-scraping-master\chapter12\2-seleniumCookies.py , size= 528B complete

[2018-06-29 22:50:23 - INFO - cp ] copy file C://pythonStudy/python爬虫参考资料\python-scraping-master\chapter12\3-honeypotDetection.py , size= 539B complete

[2018-06-29 22:50:23 - INFO - cp ] copy file

[2018-06-29 22:50:24 - INFO - cp ] copy file C://pythonStudy/python爬虫参考资料\python-scraping-master\chapter9\5-BasicAuth.py , size= 229B complete

all_file_nums 130

[2018-06-29 22:50:24 - INFO - cp ] copy file C://pythonStudy/python爬虫参考资料\python-scraping-master\files\test.csv , size= 114B complete

func {upload_file} run { 1.2971}s

[2018-06-29 22:50:24 - INFO - cp ] copy all files complete , files count = 130 , size = 620.6M

Process finished with exit code 0

工具文件

time_utils.py

def run_time(func):

"""

计算程序运行时间的装饰器

:param func:

:return:

"""

@wraps(func)

def decor(*args,**kwargs):

start = time.time()

res = func(*args,**kwargs)

end = time.time()

log.debug("func {%s} run {%10.4f}s " % (func.__name__,(end - start)))

return res

return decor

python copy文件_python批量拷贝文件相关推荐

  1. python下的所有文件_python批量复制文件夹下所有文件大小

    python复制文件夹下所有文件 Python---进阶---文件操作---获取文件夹下所有文件的数量和大小 一.####编写一个程序,统计当前目录下每个文件类型的文件数 ####思路: - 打开当前 ...

  2. python 批量处理文件_python批量处理文件或文件夹

    # -*- coding: utf-8 -*- import os,shutil import sys import numpy as np ##########批量删除不同文件夹下的同名文件夹### ...

  3. python编写代码实现文件的拷贝功能_python从一个文件夹自动拷贝文件到目标文件夹的代码...

    这里为大家提供一个python操作文件的例子,实现功能:从一个文件夹自动拷贝文件到目标文件夹. 供python爱好者学习参考. 代码如下: # Filename: CopyPictures.py im ...

  4. python批量新建文件_python批量处理

    python opencv图像二值化批量处理 from skimage import data_dir,io,transform,color,filters import numpy as np im ...

  5. linux自动批量拷贝文件

    如果有一批机器同在一个局域网,这批机器所在地址段为192.168.100.1-192.168.100.256,用户名均为test,密码123123,如何批量将某个文件拷贝到这批机器中. 首先请确保这批 ...

  6. python在当前目录创建txt文件-python根据txt文本批量创建文件夹

    前言 前言:想写这个代码的原因是因为实习的时候需要根据表格名创建对应的文件夹,如果只是很少个数文件夹的话,ctrl+shift+n还可以接受吧,可是一次就要创建几百个文件夹,这就有点方方了.所以我写了 ...

  7. python不同数据的读入_python读写不同编码txt文件_python读写txt文件

    python读写不同编码txt文件_python读写txt文件 以后整理规范 [python] view plaincopy import os import codecs filenames=os. ...

  8. (BAT批处理)如何穿透多个文件夹批量修改文件后缀名?

    如何穿透多个文件夹批量修改文件后缀名?也就是不打开文件夹,直接修改.re批处理命令不知道怎么穿透文件夹. 不清楚你的实际文件/情况,仅以问题中的说明及猜测为据:以下代码复制粘贴到记事本,另存为xx.b ...

  9. python copy模块_python日记第四章:python文件copy模块shutil

    shutil 模块 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中 import shutil ...

最新文章

  1. 下载 NCBI sra 文件
  2. 深入理解CSS盒模型
  3. @transaction使自定义注解失效_【完美】SpringBoot中使用注解来实现 Redis 分布式锁...
  4. Codeforces Round #529 (Div. 3) F. Make It Connected(最小生成树)
  5. 树莓派文字转语音 python_树莓派3-语音-实现文字转语音服务
  6. keil4怎么移植其他人的程序_关节炎怎么治疗效果才会好?
  7. (c语言)输入一个数,将该数按原规律插入到有序数组中
  8. ftp://hxtech.com
  9. 第一章 Javscript的数据类型
  10. 赶紧收藏!不可多得的Instagram运营技巧
  11. Matlab里fprintf个人理解(fprintf、display、%f、%f\n)
  12. 设置透明背景和转换图片格式的技巧
  13. TouchDesigner案例(十)缤纷
  14. ffmpeg 字幕格式转换,webvtt字幕格式,srt字幕格式
  15. git clone加速(实测推荐)
  16. Android修炼之道—Talker聊天小工具
  17. 职业自我认知的测试软件,职业生涯规划___自我认知测试.pdf
  18. python开发程序知道微信好友是否已读信息吗_基于Python+adb实现微信是否好友检测...
  19. genSIM 导入 txt 格式的词向量参数
  20. 算法——指数取模运算(蒙哥马利算法)

热门文章

  1. 利用 Windows Vista 和 WCF 中强大的 P2P 通信功能 [转]
  2. python进阶学习
  3. Android耳机拔插事件流程
  4. NI(美国国家仪器)二面
  5. 使用.pyc来加密python代码
  6. mysql 类型 bigint_MySQL的bigint类型
  7. python周志_Python学习日志9月17日 一周总结
  8. 前端React教程第一课 JSX横空出世
  9. 大学生自主开发斗地主小游戏
  10. ROP-基础-ret2libc3