Python高级文件处理模块shutil

shutil是Python中的高级文件处理模块,可以使用它来对文件进行更细粒度的操作,如仅复制权限、内容、属组、用户、状态等信息,而且shutil模块还可以做到对压缩文件进行简单的处理。

Python Version: 3.5+

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

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

1
2
3
import shutil

shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))

拷贝文件

shutil.copyfile(src, dst)

1
shutil.copyfile('f1.log', 'f2.log')

仅拷贝权限。内容、组、用户均不变

shutil.copymode(src, dst)

1
shutil.copymode('f1.log', 'f2.log')

仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

shutil.copystat(src, dst)

1
shutil.copystat('f1.log', 'f2.log')

拷贝文件和权限

shutil.copy(src, dst)

1
2
3
import shutil

shutil.copy('f1.log', 'f2.log')

拷贝文件和状态信息

shutil.copy2(src, dst)

1
2
3
import shutil

shutil.copy2('f1.log', 'f2.log')

递归的去拷贝文件夹

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)

1
2
3
import shutil

shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))

复制中软连接的问题:如果symlinks为True,那么软连接的文件会被copy到目标目录中,如果symlinks为False,那么只会将软连接进行copy,假如链接的目录不存在则会抛出异常

1
2
3
import shutil

shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))

递归的去删除文件

shutil.rmtree(path[, ignore_errors[, onerror]])

1
2
3
import shutil

shutil.rmtree('folder1')

递归的去移动文件/重命名,类似mv命令

shutil.move(src, dst)

1
2
3
import shutil

shutil.move('folder1', 'folder3')

压缩文件的处理

shutil.make_archive(base_name, format,…)

参数说明:

  • base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
    • 如:docs.tar.gz => 保存至当前路径,并以此为文件名
    • 如:/Users/PolarSnow/docs.tar.gz =>保存至/Users/PolarSnow/ 并以docs.tar.gz的文件名保存
  • format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
  • root_dir: 要压缩的文件夹路径(默认当前目录)
  • owner: 用户,默认当前用户
  • group: 组,默认当前组
  • logger: 用于记录日志,通常是logging.Logger对象
1
2
3
4
5
6
7
8
9
# 将 /Users/polarsnow/Downloads/docs 下的文件打包放置当前程序目录
# base_name不需要指定文件名的后缀,压缩后会自动在后面加上tar.gz的后缀
import shutil
ret = shutil.make_archive("docs", 'gztar', root_dir='/Users/wupeiqi/Downloads/docs')


#将 /Users/polarsnow/Downloads/docs 下的文件打包放置 /Users/polarsnow/目录下,并以docs.tar.gz命名
import shutil
ret = shutil.make_archive("/Users/wupeiqi/docs", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')