--High-level file operations,高级的文件操做模块~
shutil 模块的使用主要包括对文件及目录的移动、复制、打包、压缩(解压)、删除等操做。是对os模块的一个补充~python
复制一个文件到另外一个文件。
copyfileobj函数源码:python2.7
def copyfileobj(fsrc, fdst, length=16*1024): """copy data from file-like object fsrc to file-like object fdst""" while 1: buf = fsrc.read(length) # length 为缓冲大小 if not buf: break fdst.write(buf)
示例:ide
import shutil f_read = open(file='/Users/luyi/tmp/a.txt', mode='r') f_write = open(file='/Users/luyi/tmp/b.txt', mode='w') shutil.copyfileobj(f_read, f_write)
使用 copyfileobj 进行复制略显麻烦,源文件和目标文件都须要打开(open)才能进行复制操做~函数
一样是复制操做~
示例:日志
import shutil f_src = '/Users/luyi/tmp/a.txt' f_dest = '/Users/luyi/tmp/b.txt' shutil.copyfile(f_src, f_dest)
相比于 copyfileobj,copyfile 实现的复制操做要简单的多,在平常的使用中,也是更多的使用 copyfile 函数。其实在内部,copyfile 函数调用了 copyfileobj函数~code
复制文件的权限,即读写权限,不会复制源文件的内容及属主和属组~orm
示例:对象
➜ ls -l total 16 -rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt -rw-r--r-- 1 root wheel 4 Nov 7 22:46 b.txt >>> import shutil >>> shutil.copymode('a.txt','b.txt') ➜ ls -l total 16 -rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt -rw-rw-r-- 1 root wheel 4 Nov 7 22:46 b.txt
复制权限的过程,源文件和目标文件都必须存在,若目标文件不存在,则会报错。这里区别于 copyfile 函数,copyfile函数的目标文件能够存在也能够不存在,不存在则直接进行复制,若存在则进行覆盖~递归
➜ tmp ll total 8 -rw-r--r-- 1 baby staff 4B Nov 6 23:48 a.txt >>> import shutil >>> shutil.copymode('a.txt','b.txt') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 91, in copymode os.chmod(dst, mode) OSError: [Errno 2] No such file or directory: 'b.txt'
复制文件的全部状态信息,包括 mode bits,atime,mtime,flags,但不复制文件内容,以及文件的属主和属组~ip
➜ ls -l total 16 -rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt -rw-r--r-- 1 root wheel 4 Nov 7 22:50 b.txt ➜ stat a.txt 16777220 8603112152 -rw-rw-r-- 1 baby wheel 0 4 "Nov 7 22:48:16 2018" "Nov 7 22:46:22 2018" "Nov 7 22:46:46 2018" "Nov 7 22:46:06 2018" 4096 8 0 a.txt ➜ stat b.txt 16777220 8603112261 -rw-r--r-- 1 root wheel 0 4 "Nov 7 22:50:32 2018" "Nov 7 22:50:37 2018" "Nov 7 22:50:37 2018" "Nov 7 22:50:32 2018" 4096 8 0 b.txt >>> import shutil >>> shutil.copystat('a.txt','b.txt') # 执行复制状态操做
stat 输出的信息中包含3个时间,其中第一个是atime,第二个是mtime,最后一个是ctime。复制完成后,查看两个文件的状态信息:
➜ ls -l total 16 -rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt -rw-rw-r-- 1 root wheel 4 Nov 7 22:46 b.txt ➜ stat a.txt 16777220 8603112152 -rw-rw-r-- 1 baby wheel 0 4 "Nov 7 22:48:16 2018" "Nov 7 22:46:22 2018" "Nov 7 22:46:46 2018" "Nov 7 22:46:06 2018" 4096 8 0 a.txt ➜ stat b.txt 16777220 8603112261 -rw-rw-r-- 1 root wheel 0 4 "Nov 7 22:48:16 2018" "Nov 7 22:46:22 2018" "Nov 7 22:52:02 2018" "Nov 7 22:46:22 2018" 4096 8 0 b.txt
能够看到源文件 a.txt 的 atime,mtime 和 mode bits 已经复制到 b.txt 上,文件的属主和属组 并无发生变化。其中文件的 ctime 由系统自行维护~
复制文件的内容以及权限,即先 copyfile,而后再 copymode~
复制文件的内容以及文件的状态信息,先 copyfile,再 copystat~
递归的复制目录,以及文件的全部状态信息(不包括文件的属主和属组)
示例:
➜ ls -l test1 total 16 -rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt -rw-r--r-- 1 root wheel 4 Nov 7 22:56 b.txt >>> import shutil >>> shutil.copytree('test1', 'test2') 'test2' ➜ ls -l test2 total 16 -rw-rw-r-- 1 root wheel 4 Nov 7 22:46 a.txt -rw-r--r-- 1 root wheel 4 Nov 7 22:56 b.txt
递归的删除文件~
示例:
➜ ls -l test1 total 16 -rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt -rw-r--r-- 1 root wheel 4 Nov 7 22:56 b.txt >>> import shutil >>> shutil.rmtree('test1')
rmtree至关于 rm -fr 命令,谨慎操做~
递归的移动文件,做用与经过move命令移动目录相似~
示例:
➜ tmp ll total 0 drwxr-xr-x 4 baby staff 128B Nov 7 23:09 test >>> import shutil >>> shutil.move('test','/Users/luyi') '/Users/luyi/test' ➜ tmp ll /Users/luyi/test total 16 -rw-r--r-- 1 baby staff 4B Nov 6 23:48 a.txt -rw-r--r-- 1 baby staff 4B Nov 7 23:06 b.txt
打包或压缩文件,而且返回操做后的文件路径~
参数说明:
base_name:压缩包的文件名(abc.tar.gz,则base_name为abc),也能够是绝对路径;如果文件名,则压缩后的文件默认存放于当前目录,如果绝对路径,则压缩有的文件就保存到指定路径~
format:指定压缩或打包的类型,"zip","tar","bztar","gztar"
root_dir:须要压缩的文件或目录路径
owner:属主,默认为当前用户
group:属组,默认为当前组
logger:指定日志对象,一般是logging.Logger对象~
示例:
➜ tmp ll total 0 drwxr-xr-x 4 baby staff 128B Nov 7 23:09 test >>> import shutil >>> shutil.make_archive(base_name='test',format='zip',root_dir='test') '/Users/luyi/tmp/test.zip' >>> shutil.make_archive(base_name='test',format='gztar',root_dir='test') '/Users/luyi/tmp/test.tar.gz' >>> shutil.make_archive(base_name='test',format='tar',root_dir='test') '/Users/luyi/tmp/test.tar' >>> shutil.make_archive(base_name='test',format='bztar',root_dir='test') '/Users/luyi/tmp/test.tar.bz2' ➜ tmp ll total 48 drwxr-xr-x 4 baby staff 128B Nov 7 23:09 test -rw-r--r-- 1 baby staff 10K Nov 7 23:25 test.tar -rw-r--r-- 1 baby staff 187B Nov 7 23:25 test.tar.bz2 -rw-r--r-- 1 baby staff 195B Nov 7 23:25 test.tar.gz -rw-r--r-- 1 baby staff 206B Nov 7 23:25 test.zip
.................^_^