13Python标准库系列之shutil模块

简介:

Python标准库系列之shutil模块


The shutil module offers a number of high-level operations on files and collections of files. In particular, functions are provided which support file copying and removal. For operations on individual files, see also the os module.


对文件、文件夹、压缩包进行处理的模块。

官方文档:https://docs.python.org/3.5/library/shutil.html

文件和目录操作

shutil.copyfileobj(fsrc, fdst[, length])

将文件内容拷贝到另一个文件中

1
2
3
4
5
6
7
8
9
>>>  import  shutil
# 循环读取old.txt文件内容并写入到new.txt文件当中
>>> shutil.copyfileobj( open ( 'old.txt' , 'r' ),  open ( 'new.txt' 'w' ))
>>>  import  os
# 查看复制过去的文件内容
>>> os.system( "cat old.txt new.txt"
old
old
0

shutil.copyfile(src, dst, *, follow_symlinks=True)

拷贝整个文件,没有第二个文件就创建,有就覆盖

1
2
3
4
5
6
7
8
9
10
>>> os.system( "cat old.txt new.txt" )
old
new
0
>>> shutil.copyfile( 'old.txt' 'new.txt' )
# 把第二个文件内容给覆盖了
>>> os.system( "cat old.txt new.txt" )     
old
old
0

shutil.copymode(src, dst, *, follow_symlinks=True)

仅拷贝文件权限,文件的内容、组、用户均不变

1
2
3
4
5
6
7
8
9
10
>>> os.system( "ls -l old.txt new.txt" )    
- rw - rw - rw -  1  ansheng ansheng  4  5 月   26  15 : 54  new.txt
- rw - rw - r - -  1  ansheng ansheng  4  5 月   26  15 : 52  old.txt
0
>>> shutil.copymode( 'old.txt' 'new.txt' )
# 文件权限都变成644了
>>> os.system( "ls -l old.txt new.txt" )   
- rw - rw - r - -  1  ansheng ansheng  4  5 月   26  15 : 54  new.txt
- rw - rw - r - -  1  ansheng ansheng  4  5 月   26  15 : 52  old.txt
0

shutil.copystat(src, dst, *, follow_symlinks=True)

拷贝文件状态的信息,文件必须存在,不copy改动时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
>>> os.system( "stat old.txt new.txt" )  
   文件: 'old.txt'
   大小: 4                块: 8           IO 块: 4096    普通文件
设备: 801h / 2049d         Inode: 1835014      硬链接: 1
权限:( 0664 / - rw - rw - r - - )  Uid:(  1000 /  ansheng)   Gid:(  1000 /  ansheng)
最近访问: 2016 - 05 - 26  15 : 53 : 09.813612241  + 0800
最近更改: 2016 - 05 - 26  15 : 52 : 54.830640166  + 0800
最近改动: 2016 - 05 - 26  15 : 52 : 54.830640166  + 0800
创建时间: -
   文件: 'new.txt'
   大小: 4                块: 8           IO 块: 4096    普通文件
设备: 801h / 2049d         Inode: 1835024      硬链接: 1
权限:( 0664 / - rw - rw - r - - )  Uid:(  1000 /  ansheng)   Gid:(  1000 /  ansheng)
最近访问: 2016 - 05 - 26  15 : 56 : 22.540041783  + 0800
最近更改: 2016 - 05 - 26  15 : 54 : 24.244922722  + 0800
最近改动: 2016 - 05 - 26  15 : 55 : 38.353967649  + 0800
创建时间: -
0
>>> shutil.copystat( 'old.txt' 'new.txt' )
>>> os.system( "stat old.txt new.txt" )    
   文件: 'old.txt'
   大小: 4                块: 8           IO 块: 4096    普通文件
设备: 801h / 2049d         Inode: 1835014      硬链接: 1
权限:( 0664 / - rw - rw - r - - )  Uid:(  1000 /  ansheng)   Gid:(  1000 /  ansheng)
最近访问: 2016 - 05 - 26  15 : 53 : 09.813612241  + 0800
最近更改: 2016 - 05 - 26  15 : 52 : 54.830640166  + 0800
最近改动: 2016 - 05 - 26  15 : 52 : 54.830640166  + 0800
创建时间: -
   文件: 'new.txt'
   大小: 4                块: 8           IO 块: 4096    普通文件
设备: 801h / 2049d         Inode: 1835024      硬链接: 1
权限:( 0664 / - rw - rw - r - - )  Uid:(  1000 /  ansheng)   Gid:(  1000 /  ansheng)
最近访问: 2016 - 05 - 26  15 : 53 : 09.813612000  + 0800
最近更改: 2016 - 05 - 26  15 : 52 : 54.830640000  + 0800
最近改动: 2016 - 05 - 26  15 : 56 : 48.765143115  + 0800
创建时间: -
0

shutil.copy(src, dst, *, follow_symlinks=True)

拷贝文件和状态信息,同样不copy改动时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
>>> os.system( "stat old.txt new.txt" )  
   文件: 'old.txt'
   大小: 4                块: 8           IO 块: 4096    普通文件
设备: 801h / 2049d         Inode: 1835014      硬链接: 1
权限:( 0664 / - rw - rw - r - - )  Uid:(  1000 /  ansheng)   Gid:(  1000 /  ansheng)
最近访问: 2016 - 05 - 26  15 : 53 : 09.813612241  + 0800
最近更改: 2016 - 05 - 26  15 : 52 : 54.830640166  + 0800
最近改动: 2016 - 05 - 26  15 : 52 : 54.830640166  + 0800
创建时间: -
   文件: 'new.txt'
   大小: 0                块: 0           IO 块: 4096    普通空文件
设备: 801h / 2049d         Inode: 1835023      硬链接: 1
权限:( 0664 / - rw - rw - r - - )  Uid:(  1000 /  ansheng)   Gid:(  1000 /  ansheng)
最近访问: 2016 - 05 - 26  15 : 57 : 53.448632439  + 0800
最近更改: 2016 - 05 - 26  15 : 57 : 53.448632439  + 0800
最近改动: 2016 - 05 - 26  15 : 57 : 53.448632439  + 0800
创建时间: -
0
>>> shutil.copy2( 'old.txt' 'new.txt' )
>>> os.system( "stat old.txt new.txt" )  
   文件: 'old.txt'
   大小: 4                块: 8           IO 块: 4096    普通文件
设备: 801h / 2049d         Inode: 1835014      硬链接: 1
权限:( 0664 / - rw - rw - r - - )  Uid:(  1000 /  ansheng)   Gid:(  1000 /  ansheng)
最近访问: 2016 - 05 - 26  15 : 53 : 09.813612241  + 0800
最近更改: 2016 - 05 - 26  15 : 52 : 54.830640166  + 0800
最近改动: 2016 - 05 - 26  15 : 52 : 54.830640166  + 0800
创建时间: -
   文件: 'new.txt'
   大小: 4                块: 8           IO 块: 4096    普通文件
设备: 801h / 2049d         Inode: 1835023      硬链接: 1
权限:( 0664 / - rw - rw - r - - )  Uid:(  1000 /  ansheng)   Gid:(  1000 /  ansheng)
最近访问: 2016 - 05 - 26  15 : 53 : 09.813612000  + 0800
最近更改: 2016 - 05 - 26  15 : 52 : 54.830640000  + 0800
最近改动: 2016 - 05 - 26  15 : 58 : 07.938760974  + 0800
创建时间: -
0

shutil.ignore_patterns(*patterns)

This factory function creates a function that can be used as a callable for copytree()‘s ignore argument, ignoring files and directories that match one of the glob-style patterns provided. See the example below.

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)

递归的去拷贝文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>> os.system( "tree folder1" )
folder1
├──  dir
├──  file .txt
├── sc.pyc
├── tmp
└── vgauthsvclog.txt. 0  - / tmp / vgauthsvclog.txt. 0
2  directories,  3  files
0
# folder2目录必须不存在,symlinks=True只copy链接文件,如果等于False就copy源文件,ignore等于不copy的文件或者目录
>>> shutil.copytree( 'folder1' 'folder2' , symlinks = False , ignore = shutil.ignore_patterns( '*.pyc' 'tmp*' ))   
>>> os.system( "tree folder2" )
folder2
├──  dir
├──  file .txt
└── vgauthsvclog.txt. 0
1  directory,  2  files
0

shutil.rmtree(path, ignore_errors=False, onerror=None)

递归的去删除文件

1
2
3
4
5
6
7
>>> os.system( "ls -d folder2" )
folder2
0
>>> shutil.rmtree( 'folder2' )
>>> os.system( "ls -d folder2" )
ls: 无法访问 'folder2' : 没有那个文件或目录
512

shutil.move(src, dst, copy_function=copy2)

递归的去移动文件,它类似mv命令,其实就是重命名。

1
2
3
4
5
6
7
8
9
10
>>> os.system( "ls -ld folder1" )
drwxrwxr - 4  ansheng ansheng  4096  5 月   26  16 : 09  folder1
0
>>> shutil.move( 'folder1' 'folder3' )
>>> os.system( "ls -ld folder1" )      
ls: 无法访问 'folder1' : 没有那个文件或目录
512
>>> os.system( "ls -ld folder3" )
drwxrwxr - 4  ansheng ansheng  4096  5 月   26  16 : 09  folder3
0

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

Create an archive file (such as zip or tar) and return its name.

1
2
3
4
5
6
7
8
9
10
>>> os.system( "ls -dl folder3" )
drwxrwxr - 4  ansheng ansheng  4096  5 月   26  16 : 21  folder3
0
# /home/ansheng/folder3是保存的文件,gztar是后缀名,/home/ansheng/folder3是要打包的路径
>>> shutil.make_archive( "/home/ansheng/folder3" 'gztar' , root_dir = '/home/ansheng/folder3' )
# 返回文件打包放在那儿了
'/home/ansheng/folder3.tar.gz'
>>> os.system( "ls -dl /home/ansheng/folder3.tar.gz" )
- rw - rw - r - -  1  ansheng ansheng  263  5 月   26  16 : 22  / home / ansheng / folder3.tar.gz
0

可选参数如下:

参数 说明
base_name 压缩包的文件名,也可以是压缩包的路径。
format 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir 要压缩的文件夹路径(默认当前目录)
owner 用户,默认当前用户
group 组,默认当前组

shutil对压缩包的处理是调用ZipFile和TarFile两个模块来进行的,后面会介绍这两个模块的使用方法。











本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1925762,如需转载请自行联系原作者
目录
相关文章
|
3天前
|
数据采集 网络协议 API
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
26 8
|
7天前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
26 7
|
6天前
|
Java Serverless Python
探索Python中的并发编程与`concurrent.futures`模块
探索Python中的并发编程与`concurrent.futures`模块
12 4
|
14天前
|
机器学习/深度学习 PyTorch 算法框架/工具
python这些库和框架哪个更好
【9月更文挑战第2天】python这些库和框架哪个更好
29 6
|
14天前
|
机器学习/深度学习 数据采集 算法框架/工具
python有哪些常用的库和框架
【9月更文挑战第2天】python有哪些常用的库和框架
18 6
|
17天前
|
数据采集 XML Web App开发
6个强大且流行的Python爬虫库,强烈推荐!
6个强大且流行的Python爬虫库,强烈推荐!
WK
|
14天前
|
数据采集 XML 安全
常用的Python网络爬虫库有哪些?
Python网络爬虫库种类丰富,各具特色。`requests` 和 `urllib` 简化了 HTTP 请求,`urllib3` 提供了线程安全的连接池,`httplib2` 则具备全面的客户端接口。异步库 `aiohttp` 可大幅提升数据抓取效率。
WK
34 1
WK
|
17天前
|
机器学习/深度学习 数据采集 算法框架/工具
Python那些公认好用的库
Python拥有丰富的库,适用于数据科学、机器学习、网络爬虫及Web开发等领域。例如,NumPy和Pandas用于数据处理,Matplotlib和Dash用于数据可视化,Scikit-learn、TensorFlow和PyTorch则助力机器学习。此外,Pillow和OpenCV专长于图像处理,Pydub处理音频,Scrapy和Beautiful Soup则擅长网络爬虫工作
WK
21 4
|
17天前
|
机器学习/深度学习 JSON 数据挖掘
什么是 Python 库?
【8月更文挑战第29天】
41 4
|
16天前
|
机器学习/深度学习 存储 算法
NumPy 与 SciPy:Python 科学计算库的比较
【8月更文挑战第30天】
42 1