Doc: https://docs.python.org/2/library/shutil.html#module-shutil
shutil模块包涵了对文件和文件夹的: 复制,移动,删除, 打包,压缩 等操作。
shutil.copyfileobj(fsrcObj, fdstObj [, length])
对文件对象进行复制,因为操作的文件对象需要用open()打开才是一个对象,所以这个函数并不好用。
程序:
1 2 3 |
import shutil shutil.copyfileobj(open('001', 'r'), open('001_cp', 'w')) |
结果:
1 2 3 4 5 6 7 8 9 |
pi@raspberrypi:~/py/shutil $ ls |grep 001 001 001_shutil_copyfileobj.py pi@raspberrypi:~/py/shutil $ python 001_shutil_copyfileobj.py pi@raspberrypi:~/py/shutil $ ls |grep 001 001 001_cp 001_shutil_copyfileobj.py pi@raspberrypi:~/py/shutil $ |
shutil.copyfile(src, dst)
复制文件,从src到dst, 只复制文件内容。 权限, 修改时间等metadata不复制。
程序:
1 2 3 |
import shutil shutil.copyfile('002', '002_cp') |
结果:
1 2 3 4 5 6 7 8 |
pi@raspberrypi:~/py/shutil $ ls -la|grep 002 -rwxr-xr-x 1 pi pi 6 Sep 26 08:59 002 -rw-r--r-- 1 pi pi 49 Sep 26 08:59 002_shutil_copyfile.py pi@raspberrypi:~/py/shutil $ python 002_shutil_copyfile.py pi@raspberrypi:~/py/shutil $ ls -la|grep 002 -rwxr-xr-x 1 pi pi 6 Sep 26 08:59 002 -rw-r--r-- 1 pi pi 6 Sep 27 09:14 002_cp -rw-r--r-- 1 pi pi 49 Sep 26 08:59 002_shutil_copyfile.py |
shutil.copymode(src, dst)
只复制文件的权限。由于是只把权限复制过去,所以src, dst 两个文件都必须已经存在,如果dst不存在,就会报错:
OSError: [Errno 2] No such file or directory: ‘003_cp’
程序:
1 2 3 |
import shutil shutil.copymode('003', '003_cp') |
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 003 -rwxr-xr-x 1 pi pi 6 Sep 27 09:20 003 -rwxr-xr-x 1 pi pi 0 Sep 27 09:21 003_cp -rw-r--r-- 1 pi pi 49 Sep 26 08:59 003_shutil_copymode.py pi@raspberrypi:~/py/shutil $ chmod -x 003_cp pi@raspberrypi:~/py/shutil $ ls -la |grep 003 -rwxr-xr-x 1 pi pi 6 Sep 27 09:20 003 -rw-r--r-- 1 pi pi 0 Sep 27 09:21 003_cp -rw-r--r-- 1 pi pi 49 Sep 26 08:59 003_shutil_copymode.py pi@raspberrypi:~/py/shutil $ python 003_shutil_copymode.py pi@raspberrypi:~/py/shutil $ ls -la |grep 003 -rwxr-xr-x 1 pi pi 6 Sep 27 09:20 003 -rwxr-xr-x 1 pi pi 0 Sep 27 09:21 003_cp -rw-r--r-- 1 pi pi 49 Sep 26 08:59 003_shutil_copymode.py |
shutil.copystat(src, dst)
只复制修改时间等metadata。 也是需要src, dst两文件必须已经存在。
程序:
1 2 3 |
import shutil shutil.copystat('004', '004_cp') |
结果:
1 2 3 4 5 6 7 8 9 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 004 -rwxr-xr-x 1 pi pi 6 Sep 27 09:26 004 -rwxr-xr-x 1 pi pi 0 Sep 26 16:18 004_cp -rw-r--r-- 1 pi pi 49 Sep 26 16:16 004_shutil_copystat.py pi@raspberrypi:~/py/shutil $ python 004_shutil_copystat.py pi@raspberrypi:~/py/shutil $ ls -la |grep 004 -rwxr-xr-x 1 pi pi 6 Sep 27 09:26 004 -rwxr-xr-x 1 pi pi 0 Sep 27 09:26 004_cp -rw-r--r-- 1 pi pi 49 Sep 26 16:16 004_shutil_copystat.py |
shutil.copy(src, dst)
复制文件内容, 权限。 但修改时间等metadata不复制。 如果dst为文件夹,就在dst文件夹下创建与src同名文件。
这个函数蛮好的,可以看出复制时的时间,如果要和源文件保持一样的时间,可以用下面copy2()函数。
程序:
1 2 3 |
import shutil shutil.copy('005', '005_cp') |
结果:
1 2 3 4 5 6 7 8 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 005 -rw-r--r-- 1 pi pi 6 Sep 26 16:27 005 -rw-r--r-- 1 pi pi 45 Sep 26 16:27 005_shutil_copy.py pi@raspberrypi:~/py/shutil $ python 005_shutil_copy.py pi@raspberrypi:~/py/shutil $ ls -la |grep 005 -rw-r--r-- 1 pi pi 6 Sep 26 16:27 005 -rw-r--r-- 1 pi pi 6 Sep 27 09:38 005_cp -rw-r--r-- 1 pi pi 45 Sep 26 16:27 005_shutil_copy.py |
shutil.copy2(src, dst)
复制文件内容,权限,修改时间等metadata。
程序:
1 2 3 |
import shutil shutil.copy2('006', '006_cp') |
结果:
1 2 3 4 5 6 7 8 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 006 -rwxr-xr-x 1 pi pi 6 Sep 27 09:49 006 -rw-r--r-- 1 pi pi 46 Sep 26 16:36 006_shutil_copy2.py pi@raspberrypi:~/py/shutil $ python 006_shutil_copy2.py pi@raspberrypi:~/py/shutil $ ls -la |grep 006 -rwxr-xr-x 1 pi pi 6 Sep 27 09:49 006 -rwxr-xr-x 1 pi pi 6 Sep 27 09:49 006_cp -rw-r--r-- 1 pi pi 46 Sep 26 16:36 006_shutil_copy2.py |
shutil.copytree(src, dst, symlink=False, ignore=None)
复制文件夹src下整个树到dst。
symlink=False时, 复制符号链接时,把符号链接的文件复制过来,而不是保持一个简单的符号链接。
symlink=True时, 复制符号链接时,仍然是一个符号链接。
ignore 可以把某些文件忽略掉,不复制。
程序:
1 2 3 |
import shutil shutil.copytree('007folder', '007folder_cp') |
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 007 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 007folder -rw-r--r-- 1 pi pi 61 Sep 27 08:51 007_shutil_copytree.py pi@raspberrypi:~/py/shutil $ ls -la 007folder total 16 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 . drwxr-xr-x 8 pi pi 4096 Sep 27 10:17 .. -rw-r--r-- 1 pi pi 6 Sep 27 08:51 001 -rw-r--r-- 1 pi pi 6 Sep 27 08:51 002.tmp pi@raspberrypi:~/py/shutil $ python 007_shutil_copytree.py pi@raspberrypi:~/py/shutil $ ls -la |grep 007 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 007folder drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 007folder_cp -rw-r--r-- 1 pi pi 61 Sep 27 08:51 007_shutil_copytree.py pi@raspberrypi:~/py/shutil $ ls -la 007folder_cp total 16 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 . drwxr-xr-x 9 pi pi 4096 Sep 27 10:18 .. -rw-r--r-- 1 pi pi 6 Sep 27 08:51 001 -rw-r--r-- 1 pi pi 6 Sep 27 08:51 002.tmp |
程序:
1 2 3 |
import shutil shutil.copytree('008folder', '008folder_cp', ignore=shutil.ignore_patterns('*.tmp')) |
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 008 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 008folder -rw-r--r-- 1 pi pi 101 Sep 27 08:51 008_shutil_copytree_ignor_patterns.py pi@raspberrypi:~/py/shutil $ ls -la 008folder/ total 16 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 . drwxr-xr-x 8 pi pi 4096 Sep 27 10:23 .. -rw-r--r-- 1 pi pi 6 Sep 27 08:51 001 -rw-r--r-- 1 pi pi 6 Sep 27 08:51 002.tmp pi@raspberrypi:~/py/shutil $ python 008_shutil_copytree_ignor_patterns.py pi@raspberrypi:~/py/shutil $ ls -la |grep 008 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 008folder drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 008folder_cp -rw-r--r-- 1 pi pi 101 Sep 27 08:51 008_shutil_copytree_ignor_patterns.py pi@raspberrypi:~/py/shutil $ ls -la 008folder_cp total 12 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 . drwxr-xr-x 9 pi pi 4096 Sep 27 10:24 .. -rw-r--r-- 1 pi pi 6 Sep 27 08:51 001 |
程序:
1 2 3 4 |
import shutil shutil.copytree('009folder', '009folder_cp_symlink_True', symlinks=True) shutil.copytree('009folder', '009folder_cp_symlink_False', symlinks=False) |
结果:
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 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 009 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 009folder -rw-r--r-- 1 pi pi 163 Sep 27 08:51 009_shutil_copytree_symlinks.py pi@raspberrypi:~/py/shutil $ ls -la 009folder/ total 16 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 . drwxr-xr-x 7 pi pi 4096 Sep 27 10:27 .. -rw-r--r-- 1 pi pi 6 Sep 27 08:51 001 -rw-r--r-- 1 pi pi 6 Sep 27 08:51 002.tmp lrwxrwxrwx 1 pi pi 16 Sep 27 08:51 linkfile -> ../008folder/001 pi@raspberrypi:~/py/shutil $ python 009_shutil_copytree_symlinks.py pi@raspberrypi:~/py/shutil $ ls -la |grep 009 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 009folder drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 009folder_cp_symlink_False drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 009folder_cp_symlink_True -rw-r--r-- 1 pi pi 163 Sep 27 08:51 009_shutil_copytree_symlinks.py pi@raspberrypi:~/py/shutil $ ls -la 009folder_cp_symlink_False total 20 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 . drwxr-xr-x 9 pi pi 4096 Sep 27 10:27 .. -rw-r--r-- 1 pi pi 6 Sep 27 08:51 001 -rw-r--r-- 1 pi pi 6 Sep 27 08:51 002.tmp -rw-r--r-- 1 pi pi 6 Sep 27 08:51 linkfile pi@raspberrypi:~/py/shutil $ ls -la 009folder_cp_symlink_True/ total 16 drwxr-xr-x 2 pi pi 4096 Sep 27 08:51 . drwxr-xr-x 9 pi pi 4096 Sep 27 10:27 .. -rw-r--r-- 1 pi pi 6 Sep 27 08:51 001 -rw-r--r-- 1 pi pi 6 Sep 27 08:51 002.tmp lrwxrwxrwx 1 pi pi 16 Sep 27 10:27 linkfile -> ../008folder/001 |
shutil.rmtree(path[, ignore_errors[, onerror]])
删除目录树。
程序:
1 2 3 |
import shutil shutil.rmtree('010') |
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 010 drwxr-xr-x 3 pi pi 4096 Sep 27 10:38 010 drwxr-xr-x 3 pi pi 4096 Sep 27 10:35 010.bak drwxr-xr-x 2 pi pi 4096 Sep 27 10:34 010_link -rw-r--r-- 1 pi pi 37 Sep 27 10:36 010_shutil_rmtree.py pi@raspberrypi:~/py/shutil $ ls -la 010 total 16 drwxr-xr-x 3 pi pi 4096 Sep 27 10:38 . drwxr-xr-x 12 pi pi 4096 Sep 27 10:38 .. -rw-r--r-- 1 pi pi 6 Sep 27 10:38 abc.txt drwxr-xr-x 2 pi pi 4096 Sep 27 10:38 folder lrwxrwxrwx 1 pi pi 15 Sep 27 10:38 link -> ../010_link/ppp pi@raspberrypi:~/py/shutil $ python 010_shutil_rmtree.py pi@raspberrypi:~/py/shutil $ ls -la |grep 010 drwxr-xr-x 3 pi pi 4096 Sep 27 10:35 010.bak drwxr-xr-x 2 pi pi 4096 Sep 27 10:34 010_link -rw-r--r-- 1 pi pi 37 Sep 27 10:36 010_shutil_rmtree.py pi@raspberrypi:~/py/shutil $ ls -la 010_link total 12 drwxr-xr-x 2 pi pi 4096 Sep 27 10:34 . drwxr-xr-x 11 pi pi 4096 Sep 27 10:42 .. -rw-r--r-- 1 pi pi 6 Sep 27 10:34 ppp |
shutil.move(src, dst)
移动文件或文件夹。
程序:
1 2 3 |
import shutil shutil.move('011', '011_move') |
结果:
1 2 3 4 5 6 7 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 011 drwxr-xr-x 3 pi pi 4096 Sep 27 10:51 011 -rw-r--r-- 1 pi pi 47 Sep 27 10:52 011_shutil_move.py pi@raspberrypi:~/py/shutil $ python 011_shutil_move.py pi@raspberrypi:~/py/shutil $ ls -la |grep 011 drwxr-xr-x 3 pi pi 4096 Sep 27 10:51 011_move -rw-r--r-- 1 pi pi 47 Sep 27 10:52 011_shutil_move.py |
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])
打包。
程序:
1 2 3 4 5 6 7 |
import shutil import os archive_name = os.path.expanduser(os.path.join('~', 'py', 'shutil', '012')) #print archive_name root_dir = os.path.expanduser(os.path.join('~', 'py', 'shutil', '012folder')) shutil.make_archive(archive_name, 'gztar', root_dir) |
结果:
1 2 3 4 5 6 7 8 |
pi@raspberrypi:~/py/shutil $ ls -la |grep 012 drwxr-xr-x 2 pi pi 4096 Sep 27 13:44 012folder -rw-r--r-- 1 pi pi 253 Sep 27 13:44 012_shutil_make_archive.py pi@raspberrypi:~/py/shutil $ python 012_shutil_make_archive.py pi@raspberrypi:~/py/shutil $ ls -la |grep 012 drwxr-xr-x 2 pi pi 4096 Sep 27 13:44 012folder -rw-r--r-- 1 pi pi 253 Sep 27 13:44 012_shutil_make_archive.py -rw-r--r-- 1 pi pi 193 Sep 27 13:57 012.tar.gz |
Github: https://github.com/allenmo/python_study/tree/master/shutil