文件高阶操作复制查找处理目录树打包文件shutil

1.概述

shutil模块包含了文件高级操作,比如复制文件、查找文件、处理目录树、打包文件。

2.复制文件

2.1.文件对文件复制copyfile

copyfile方法将源文件内容复制到目标文件中,如果没有权限写目标文件,则会产生IOError

import glob
import shutilprint('BEFORE:', glob.glob('test.*'))# 指定源文件和目标文件
shutil.copyfile('test.txt', 'example/copy_test.txt')print('AFTER:', glob.glob('example/*'))

这个例子将从源文件中读取内容,然后将内容复制到目标文件中,如果目标文件不存在则会创建目标文件并拷贝内容。

BEFORE: ['test.txt']
AFTER: ['example/copy_test.txt']

2.2.文件对目录copy

copy()copyfile() 区别是copyfile拷贝目标必须是文件,copy拷贝的目标可以是文件也可以是目录。
copy函数将源文件内容拷贝到目标对象时,如果目标是个文件夹则会以源文件名称在该路径下创建文件,并把内容拷贝到目标文件中。

import glob
import os
import shutilos.mkdir('example')
print('BEFORE:', glob.glob('example/*'))shutil.copy('test.txt', 'example')print('AFTER :', glob.glob('example/*'))

这个例子将test文件拷贝到example目录下,他会在动在该目录下创建test文件并将内容拷贝过来。

BEFORE: []
AFTER : ['example/test.txt']

下面例子拷贝目标对象时文件,直接将源文件内容拷贝到目标文件中

import glob
import os
import shutilos.mkdir('example')
print('BEFORE:', glob.glob('example/*'))shutil.copy('test.txt', 'example/copy.txt')print('AFTER :', glob.glob('example/*'))

运行结果

BEFORE: []
AFTER : ['example/copy.txt']

2.3.拷贝文件属性copy2

copy2函数和copy函数类似,在复制到新文件的元数据中包含访问和修改时间。

mport os
import shutil
import time# 读取文件信息
def show_file_info(filename):stat_info = os.stat(filename)print('  Mode    :', oct(stat_info.st_mode))print('  Created :', time.ctime(stat_info.st_ctime))print('  Accessed:', time.ctime(stat_info.st_atime))print('  Modified:', time.ctime(stat_info.st_mtime))os.mkdir('example2')
print('SOURCE:')
#输出源文件信息
show_file_info('test.txt')# 拷贝文件
shutil.copy2('test.txt', 'example2')print('DEST:')
# 输出目标文件信息
show_file_info('example2/test.txt')

运行上面代码,拷贝文件时将源文件的修改和访问时间一同拷贝

SOURCE:Mode    : 0o100644Created : Tue Feb 14 19:23:16 2023Accessed: Tue Feb 14 19:23:17 2023Modified: Tue Feb 14 19:23:16 2023
DEST:Mode    : 0o100644Created : Tue Feb 14 19:50:42 2023Accessed: Tue Feb 14 19:23:17 2023Modified: Tue Feb 14 19:23:16 2023

2.4.复制文件元数据

默认情况下,Unix 上创建一个新文件的时候,它的权限依赖于当前用户的 umask。为了将文件权限从一个复制到另一个,请使用 copymode()。

import os
import shutil
import subprocesswith open('file_to_change.txt', 'wt') as f:f.write('content')
# 修改目标文件权限
os.chmod('file_to_change.txt', 0o444)print('BEFORE:', oct(os.stat('file_to_change.txt').st_mode))# 将源文件权限复制到目标文件
shutil.copymode('test.txt', 'file_to_change.txt')print('AFTER :', oct(os.stat('file_to_change.txt').st_mode))

运行代码,将test.txt文件权限复制到file_to_change.txt文件,只复制权限不复制文件内容。

BEFORE: 0o100444
AFTER : 0o100644

copystat()赋值文件其他权限

import os
import shutil
import timedef show_file_info(filename):stat_info = os.stat(filename)print('  Mode    :', oct(stat_info.st_mode))print('  Created :', time.ctime(stat_info.st_ctime))print('  Accessed:', time.ctime(stat_info.st_atime))print('  Modified:', time.ctime(stat_info.st_mtime))with open('file_to_change.txt', 'wt') as f:f.write('content')
os.chmod('file_to_change.txt', 0o444)print('BEFORE:')
show_file_info('file_to_change.txt')shutil.copystat('shutil_copystat.py', 'file_to_change.txt')print('AFTER:')
show_file_info('file_to_change.txt')

运行代码copystat() 只会复制与文件关联的权限和日期

SOURCE:Mode    : 0o100644Created : Wed Dec 28 19:03:12 2016Accessed: Wed Dec 28 19:03:49 2016Modified: Wed Dec 28 19:03:12 2016
DEST:Mode    : 0o100644Created : Wed Dec 28 19:03:49 2016Accessed: Wed Dec 28 19:03:49 2016Modified: Wed Dec 28 19:03:12 2016

3.处理目录树

shutil 模块提供了三个方法处理目录树。为了将目录从一个地方复制到另一个,请使用 copytree() 。它递归源目录内容,将每个文件复制到目标目录,目标目录必须不存在。

3.1.递归赋值目录

symlinks 参数控制符号链接是被赋值为链接还是文件。默认情况下时将内容复制到新的文件。如果这个参数是 true ,将会在目标目录树中创建新的符号链接。

import glob
import pprint
import shutilprint('BEFORE:')
pprint.pprint(glob.glob('/tmp/example/*'))shutil.copytree('../shutil', '/tmp/example')print('\nAFTER:')
pprint.pprint(glob.glob('/tmp/example/*'))

3.2.指定复制的内容

copytree() 方法使用两个回调参数控制它的行为。ignore 参数在每个目录或者子目录以及目录中内容被复制时调用,它返回一个应该被复制的内容列表。copy_function 参数用于在文件实际复制时调用

import glob
import pprint
import shutildef verbose_copy(src, dst):print('copying\n {!r}\n to {!r}'.format(src, dst))return shutil.copy2(src, dst)print('BEFORE:')
pprint.pprint(glob.glob('/tmp/example/*'))
print()shutil.copytree('../shutil', '/tmp/example',copy_function=verbose_copy,ignore=shutil.ignore_patterns('*.py'),
)print('\nAFTER:')
pprint.pprint(glob.glob('/tmp/example/*'))

这个例子中,ignore_patterns() 用于去创建一个忽略方法跳过 Python 源文件。verbose_copy() 复制的文件名称然后调用 copy2() 复制,它是默认的复制方法。

BEFORE:
[]copying'../shutil/example.out'to '/tmp/example/example.out'
copying'../shutil/file_to_change.txt'to '/tmp/example/file_to_change.txt'
copying'../shutil/index.rst'to '/tmp/example/index.rst'AFTER:
['/tmp/example/example','/tmp/example/example.out','/tmp/example/file_to_change.txt','/tmp/example/index.rst']

3.3.删除目录及文件

要删除一个目录及其中的内容,使用rmtree()

import glob
import pprint
import shutilprint('BEFORE:')
pprint.pprint(glob.glob('/tmp/example/*'))shutil.rmtree('/tmp/example')print('\nAFTER:')
pprint.pprint(glob.glob('/tmp/example/*'))

错误默认情况下引发为异常,但是如果第二个参数为 true 将被忽略,也可以通过第三个参数提供一个错误处理方法

BEFORE:
['/tmp/example/example','/tmp/example/example.out','/tmp/example/file_to_change.txt','/tmp/example/index.rst']AFTER:
[]

3.4.移动目录或文件move

可以使用 move() 将一个文件或者目录从一个地方移到另一个地方

import glob
import shutilwith open('example.txt', 'wt') as f:f.write('contents')print('BEFORE: ', glob.glob('example*'))shutil.move('example.txt', 'example.out')print('AFTER : ', glob.glob('example*'))

原理类似于 Unix 命令 mv 。如果源文件和目标文件都存在,源文件将会被重命名。否则源文件被复制到目的地然后被删除。

BEFORE:  ['example.txt']
AFTER :  ['example.out']

4.查找文件which

4.1.查找文件

which() 方法会按照一个搜索路径查找文件。典型的使用场景是在环境变量 PATH 定义的路径中查找可执行程序的位置。

import shutilprint(shutil.which('virtualenv'))
print(shutil.which('tox'))
print(shutil.which('no-such-program'))

如果没有找到文件,which() 返回 None

/Users/dhellmann/Library/Python/3.5/bin/virtualenv
/Users/dhellmann/Library/Python/3.5/bin/tox
None

4.2.查找规则查找文件

which() 方法接收参数依据文件权限以及搜索路径进行过滤。
path 参数默认是 os.environ(‘PATH’),但是可以是任何由 os.pathsep 分隔的字符串。
mode 参数应该是一个匹配文件权限的位掩码。默认情况下查找可执行文件,但是下列的例子使用了可读掩码以及一个搜索路径去查找配置文件

import os
import shutilpath = os.pathsep.join(['.',os.path.expanduser('~/pymotw'),
])mode = os.F_OK | os.R_OKfilename = shutil.which('config.ini',mode=mode,path=path,
)print(filename)

以这种方式查找文件可能会存在冲突,因为在查找文件和使用文件之间,文件可以为删除或者它的权限会被修改

./config.ini

5.归档

Python 标准库包含了许多模块用于管理压缩文件,例如 tarfile 和 zipfile。shutil 模块中也有几个高阶方法用于解压缩文件。

5.1.获取支持的打包格式get_archive_formats

get_archive_formats() 返回一个当前系统支持的格式名称以及描述列表

import shutilfor format, description in shutil.get_archive_formats():print('{:<5}: {}'.format(format, description))

运行结果,查看当前系统支持的打包类型

bztar: bzip2'ed tar-file
gztar: gzip'ed tar-file
tar  : uncompressed tar file
xztar: xz'ed tar-file
zip  : ZIP file

5.2.创建压缩文件make_archive

可以使用 make_archive() 创建一个新的压缩文件。其输入旨在最好地支持压缩整个目录以及所有内容。默认情况下,它使用当前工作目录,以便所有文件和子目录出现在压缩文件的顶层。

make_archive() 函数参数介绍

  • base_name:创建压缩包的文件名,也可以是压缩包的路径;只是文件名时,则保存至当前目录下,否则保存至指定路径;
  • format:压缩包种类,“zip”, “tar”, “bztar”,“gztar”;
  • base_dir:指定要压缩的源文件路径,将该路径下的文件打成压缩包。可以指定路径下的文件名,也可以指定路径;
  • root_dir:指定要压缩的路径根目录(默认当前目录),只能指定路径,优先级低于base_dir。
import logging
import shutil
import sys
import tarfilelogging.basicConfig(format='%(message)s',stream=sys.stdout,level=logging.DEBUG,
)
logger = logging.getLogger('pymotw')print('Creating archive:')
shutil.make_archive(# 创建压缩包路径和名称base_name='./example',# 压缩包后缀format='gztar',# 源文件根目录root_dir='..',# 源文件目录base_dir='my_zip',logger=logger,
)print('\nArchive contents:')
# 查看
with tarfile.open('example.tar.gz', 'r') as t:for n in t.getnames():print(n)

该示例root_dir指定为当前路径的父路径,base_dir指定为父路径下的myzip目录,最后将myzip目录及子文件打包。

Creating archive:
changing into '..'
Creating tar archive
changing back to '/Users/edy/Documents/pythonwork/pyproject/flask_restX/src/app/python3_standard_library/6_chapter/my_zip'Archive contents:
my_zip
my_zip/.DS_Store
my_zip/__init__.py
my_zip/my_zip.py

5.3.获取系统解压缩包格式列表get_unpack_formats

shutil 模块维护了一个可在当前系统上解压缩的格式注册表,通过 get_unpack_formats() 访问
get_unpack_formats()函数返回值

  • format 压缩格式名称
  • exts 后缀
  • description 压缩包格式描述
import shutilfor format, exts, description in shutil.get_unpack_formats():print('{:<5}: {}, names ending in {}'.format(format, description, exts))

运行代码,返回解压缩格式列表

bztar: bzip2'ed tar-file, names ending in ['.tar.bz2', '.tbz2']
gztar: gzip'ed tar-file, names ending in ['.tar.gz', '.tgz']
tar  : uncompressed tar file, names ending in ['.tar']
xztar: xz'ed tar-file, names ending in ['.tar.xz', '.txz']
zip  : ZIP file, names ending in ['.zip']

5.4.解压缩包unpack_archive

unpack_archive() 解压文件,传入压缩文件名以及可选的解压目录,默认是当前目录
unpack_archive() 参数介绍

  • filename:归档文件名称
  • extract_dir:归档文件解压的目标位置
  • format:使用指定格式的解压器解压归档文件。
import pathlib
import shutil
import sys
import tempfilewith tempfile.TemporaryDirectory() as d:print('Unpacking archive:')shutil.unpack_archive('example.tar.gz',extract_dir=d,)# 查看解压文件内容print('\nCreated:')prefix_len = len(d) + 1for extracted in pathlib.Path(d).rglob('*'):print(str(extracted)[prefix_len:])

这个例子中 format没有指定解压格式,unpack_archive() 能够根据文件名后缀 tar.gz 判断压缩格式,并且该值与解压缩注册表中的 gztar 相关联自动解压。

Unpacking archive:Created:
my_zip
my_zip/.DS_Store
my_zip/__init__.py
my_zip/my_zip.py

6.文件系统空间

在执行一个长期运行并且消耗空间的操作之前检查当前系统可用空间会是非常有用的,否则会因为空间不足导致操作失败。

6.1.查询系统空间信息

disk_usage() 返回一个元组表示系统总空间,当前使用总量以及剩余总量。参数接收一个路径,查看该路径所属磁盘空间容量。

import shutil# 返回磁盘总空间,使用空间,剩余空间
total_b, used_b, free_b = shutil.disk_usage('.')# GiB"的二进制单位,专用来标示“1024进位”的数据大小
# GB(gigabyte)是十进制的容量单位,是1000进位的数据单位
gib = 2 ** 30  # GiB == gibibyte
gb = 10 ** 9   # GB == gigabyteprint('Total: {:6.2f} GB  {:6.2f} GiB'.format(total_b / gb, total_b / gib))
print('Used : {:6.2f} GB  {:6.2f} GiB'.format(used_b / gb, used_b / gib))
print('Free : {:6.2f} GB  {:6.2f} GiB'.format(free_b / gb, free_b / gib))

运行结果

Total: 250.66 GB  233.44 GiB
Used : 169.55 GB  157.90 GiB
Free :  62.70 GB   58.40 GiB

文件高阶操作复制查找处理目录树打包文件shutil相关推荐

  1. 深度学习(15)TensorFlow高阶操作四: 填充与复制

    深度学习(15)TensorFlow高阶操作四: 填充与复制 1. Pad 2. 常用于Image Padding 3. tile 4. tile VS broadcast_to Outline pa ...

  2. zotero文献管理高阶操作|全网最新最全的zotero高效运用技巧,quicker动作大盘点

    大家能都知道quicker是电脑端的效率神器,可以然你解放双手,提高你的办公效率,当然,也是科研效率神器,截止2022年10月16日,与zotero相关的动作已经有66个.今天就让让我盘点几个可以让你 ...

  3. PS高阶操作之字体特效

    PS高阶操作之字体特效 字体冰封效果 字体金属样式 字体冰封效果 新建一个白色的像素画布. 新建好画布后,用油漆桶刷成深蓝色. 打开通道,新建一个通道,选择文字工具. 调整文字大小和位置.在菜单栏中选 ...

  4. PS高阶操作之木质纹理

    PS高阶操作之木质纹理 制作木纹纹理 制作木纹相框 制作木纹纹理 新建画布,大小随意. 用油漆桶工具填充棕色,并解锁背景图层,菜单栏选择滤镜-杂色-添加杂色 数量-60 分布-高斯分布. 滤镜-模糊- ...

  5. linux如何查看指定目录下文件内容,Linux 系统下通过关键词查找指定目录下的文件内容...

    #!/bin/bash # 作者:靑龍一笑(C.S.Ricen) # 功能:根据指定的关键词,查找指定目录下的文件内容 # 要查找的目录 Search_Dir=/opt/datas/ # 关键字列表 ...

  6. 深度学习(17)TensorFlow高阶操作六: 高阶OP

    深度学习(17)TensorFlow高阶操作六: 高阶OP 1. Where(tensor) 2. where(cond, A, B) 3. 1-D scatter_nd 4. 2-D scatter ...

  7. 深度学习(16)TensorFlow高阶操作五: 张量限幅

    深度学习(16)TensorFlow高阶操作五: 张量限幅 1. clip_by_value 2. relu 3. clip_by_norm 4. Gradient clipping 5. 梯度爆炸实 ...

  8. 深度学习(14)TensorFlow高阶操作三: 张量排序

    深度学习(14)TensorFlow高阶操作三: 张量排序 一. Sort, argsort 1. 一维Tensor 2. 多维Tensor 二. Top_k 三. Top-k accuracy(To ...

  9. 深度学习(12)TensorFlow高阶操作一: 合并与分割

    深度学习(12)TensorFlow高阶操作一: 合并与分割 1. concat 2. stack: create new dim 3. Dim mismatch 4. unstuck 5. spli ...

最新文章

  1. RocketMQ 介绍 msgId生成算法
  2. 如何借助高考热点,微信公众号两天疯狂引流2万+
  3. WinCE驱动编写小结
  4. 数据结构-单向循环链表、双向循环链表、仿真链表
  5. JavaScript知识笔记(二)——事件
  6. Java消息中间件--ActiveMq,RabbitMQ,Kafka
  7. JavaScript学习 第四课(四)
  8. 所有的 iPhone 和高端 Android 设备都被破解了!
  9. 【codevs1295】N皇后问题
  10. Python手动安装 package
  11. 利用Windows自带的Certutil查看文件MD5
  12. 南宁Java程序员平均工资_南宁程序员平均工资 在南宁做程序员有一万工资吗
  13. Ruff Chain 将亮相新加坡WDAS 2018世界数字资产峰会
  14. 黄海广:那些年做的学术公益——你不是一个人在战斗
  15. Unity与讯飞的aiui交互
  16. 图解 Vue3.0 编译器核心原理(Vue3.0源码解析)
  17. J2EE、J2SE、J2ME的区别
  18. 全面支持ROS,思岚科技发布SLAMWARE ROS SDK !
  19. 优秀开源产品推荐:Tpflow工作流引擎
  20. MySQL学习之数据库查询

热门文章

  1. 天干地支计算公式_什么是天干地支?天干地支有哪几个?计算方法是什么?
  2. 简单的投票页面,只有一个html页面
  3. 使用步进电机和Android App的蓝牙控制迷你升降机
  4. JavaScript中 queue(队列)的应用与实现
  5. Android使用学习之绘图(Canvas,Paint)与手势感应及其应用(乒乓球小游戏)
  6. 【通信协议】UART、RS232、RS485、I2C、SPI、CAN
  7. 基于51的电动车警报系统
  8. python基础之字典的访问
  9. poi导出excel,数据相同时自动居中合并
  10. 2020年,你如何更好的计划与系统的学习PHP