python基础--shutil模块
shutil模块提供了大量的文件的高级操作。
特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作。对单个文件的操作也可参见os模块。
注意
即便是更高级别的文件复制函数(shutil.copy(),shutil.copy2())也不能复制所有文件的元数据。
这意味着在linux平台上,文件的所有者和组以及访问控制列表都将丢失。
在Mac OS中资源fork和其他元数据无法使用。这意味着资源将丢失,文件类型和创建者代码将不正确。
在Windows上,文件所有者,ACL和备用数据流不会被复制。
1)shutil.copyfileobj(src, dst[, length])
将文件内容拷贝到另一个文件中,可以部分内容.
复制文件内容(不包含元数据)从类文件对象src到类文件对dst。
可选参数length指定缓冲区的大小,负数表示一次性读入。
默认会把数据切分成小块拷贝,以免占用太多内存。
length默认值:length=16*1024
注意:拷贝是从src的当前文件开始
import shutil r_file=open("test1.py",'r',encoding="utf-8") w_file=open("test22.py",'w',encoding="utf-8") shutil.copyfileobj(r_file,w_file,2)
2)shutil.copyfile(src, dst)
拷贝文件
shutil.copyfile(src, dst):复制文件内容(不包含元数据)从src到dst。 DST必须是完整的目标文件名;拷贝目录参见shutil.copy()。
如果src和dst是同一文件,就会引发错误shutil.Error。dst必须是可写的,否则将引发异常IOError。
如果dst已经存在,它会被替换。特殊文件,例如字符或块设备和管道不能使用此功能,因为copyfile会打开并阅读文件。 src和dst的是字符串形式的路径名。
例子如下:
shutil.copyfile("test1.py","test2-2.py")
3)shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不变
root@store1 python]# cat 1.txt 1111111111122222222 [root@store1 python]# python Python 3.6.0 (default, Feb 16 2017, 20:26:37) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import shutil >>> shutil.copy("1.txt","2.txt") '2.txt' >>> exit [root@store1 python]# ls -l total 8 -rw-r--r--. 1 root root 20 May 13 21:16 1.txt -rw-r--r--. 1 root root 20 May 13 21:17 2.txt
4)shutil.copystat(src, dst)
拷贝状态的信息,包括:mode bits, atime, mtime, flags。dst文件必须存在。注意结果和copymode对比。copymode时间是不一样的。copystat时间同步
>>> shutil.copystat("1.txt","2.txt") >>> [root@store1 python]# ls -l total 8 -rw-r--r--. 1 root root 20 May 13 21:16 1.txt -rw-r--r--. 1 root root 20 May 13 21:16 2.txt
5)shutil.copy(src, dst)
拷贝文件和权限。调用copyfile(src, dst)和copymode(src, dst)
[root@store1 python]# python Python 3.6.0 (default, Feb 16 2017, 20:26:37) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import shutil >>> shutil.copy("1.txt","3.txt") '3.txt' >>> [root@store1 python]# ls -l total 12 -rw-r--r--. 1 root root 20 May 13 21:16 1.txt -rw-r--r--. 1 root root 20 May 13 21:16 2.txt -rw-r--r--. 1 root root 20 May 13 21:31 3.txt
6)shutil.copy2(src, dst)
拷贝文件和状态信息,调用copyfile(src, dst)和copystat(src, dst)
7)shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件
drwxr-xr-x. 2 root root 45 May 13 21:38 dir1 [root@store1 python]# python Python 3.6.0 (default, Feb 16 2017, 20:26:37) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import shutil >>> shutil.copytree("dir1","dir2") 'dir2' >>> [root@store1 python]# ls -R .: dir1 dir2 ./dir1: 1.txt 2.txt 3.txt ./dir2: 1.txt 2.txt 3.txt [root@store1 python]#
8)shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件
[root@store1 python]# tree . ├── dir1 │ ├── 1.txt │ ├── 2.txt │ └── 3.txt └── dir2 ├── 1.txt ├── 2.txt └── 3.txt 2 directories, 6 files [root@store1 python]# python Python 3.6.0 (default, Feb 16 2017, 20:26:37) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import shutil >>> shutil.rmtree("dir2") >>> [root@store1 python]# tree . └── dir1 ├── 1.txt ├── 2.txt └── 3.txt 1 directory, 3 files [root@store1 python]#
9)shutil.move(src, dst)
递归的去移动文件
[root@store1 python]# tree . ├── dir1 │ ├── 1.txt │ ├── 2.txt │ └── 3.txt └── dir2 2 directories, 3 files [root@store1 python]# python Python 3.6.0 (default, Feb 16 2017, 20:26:37) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import shutil >>> shutil.move("dir1/1.txt","dir2") 'dir2/1.txt' >>> [root@store1 python]# tree . ├── dir1 │ ├── 2.txt │ └── 3.txt └── dir2 └── 1.txt 2 directories, 3 files [root@store1 python]#
10)shutil.make_archive(base_name, format,...)
创建压缩包并返回文件路径,例如:zip、tar
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如:www =>保存至当前路径
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要压缩的文件夹路径(默认当前目录)
owner: 用户,默认当前用户
group: 组,默认当前组
logger: 用于记录日志,通常是logging.Logger对象
[root@store1 python]# tree . ├── dir1 │ ├── 2.txt │ └── 3.txt └── dir2 └── 1.txt 2 directories, 3 files [root@store1 python]# python Python 3.6.0 (default, Feb 16 2017, 20:26:37) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import shutil >>> shutil.make_archive("dir1","zip") 'dir1.zip' >>> shutil.make_archive("dir1","tar",root_dir="dir2") '/home/python/dir1.tar' >>> shutil.make_archive("dir1","tar",root_dir="/home/python/dir2") '/home/python/dir1.tar' >>> shutil.make_archive("/home/python/dir2","tar",root_dir="dir1")#将dir1压缩成/home/pyhton/dir2 '/home/python/dir2.tar' >>> [root@store1 python]# tree . ├── dir1 │ ├── 2.txt │ └── 3.txt ├── dir1.tar ├── dir1.zip ├── dir2 │ └── 1.txt └── dir2.tar 2 directories, 6 files [root@store1 python]#
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的