1、模块介绍
import shutil
copyfileobj(fsrc, fdst, length=0)
copyfile(src, dst, *, follow_symlinks=True)
copymode(src, dst, *, follow_symlinks=True)
copystat(src, dst, *, follow_symlinks=True)
copy(src, dst, *, follow_symlinks=True)
copy2(src, dst, *, follow_symlinks=True)
copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)
rmtree(path, ignore_errors=False, onerror=None)
move(src, dst, copy_function=copy2)
2、copytree 示例
- 递归复制目录,默认使用
copy2 ,也就是带更多的元数据复制 src、dst 必须是目录,src 必须存在,dst 必须不存在ignore=func ,提供一个 callable(src, names) -> ignored_names ,提供一个函数,它会被调用。src 是源目录, names 是 os.listdir(src) 的结果,就是列出 src 中的文件名,返回值是要被过滤的文件名的set类型数据
copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)
In [426]: import os
In [427]: os.listdir('src')
Out[427]: ['a1.txt', 'a2.txt', 'b1.txt', 'b2.txt', 'b3.txt', 'c1.txt']
In [428]: p = Path('src')
In [429]: os.listdir(p)
Out[429]: ['a1.txt', 'a2.txt', 'b1.txt', 'b2.txt', 'b3.txt', 'c1.txt']
In [430]: ll src/
total 0
-rw-r--r--. 1 root 0 Mar 28 11:37 a1.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 a2.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 b1.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 b2.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 b3.txt
-rw-r--r--. 1 root 0 Mar 28 11:38 c1.txt
In [420]: import shutil
In [421]: def ignore(src, names):
...: return set(filter(lambda x:x.startswith('a'), names))
In [424]: shutil.copytree('src', 'dst', ignore=ignore)
Out[424]: 'dst'
In [425]: ll dst/
total 0
-rw-r--r--. 1 root 0 Mar 28 11:37 b1.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 b2.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 b3.txt
-rw-r--r--. 1 root 0 Mar 28 11:38 c1.txt
In [431]: shutil.rmtree('dst')
In [433]: ll src/
total 0
-rw-r--r--. 1 root 0 Mar 28 11:37 a1.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 a2.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 b1.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 b2.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 b3.txt
-rw-r--r--. 1 root 0 Mar 28 11:38 c1.txt
In [435]: def ignore(src, names):
...: return {name for name in names if name.startswith('b')}
In [436]: shutil.copytree('src', 'dst', ignore=ignore)
Out[436]: 'dst'
In [437]: ll dst/
total 0
-rw-r--r--. 1 root 0 Mar 28 11:37 a1.txt
-rw-r--r--. 1 root 0 Mar 28 11:37 a2.txt
-rw-r--r--. 1 root 0 Mar 28 11:38 c1.txt
3、move 示例
In [438]: os.rename('dst', 'dst1')
In [439]: ll
total 28
drwxr-xr-x. 3 root 15 Mar 25 20:42 a/
drwxr-xr-x. 3 root 15 Mar 25 20:42 dest/
drwxr-xr-x. 2 root 48 Mar 28 11:38 dst1/
-rw-r--r--. 1 root 9 Mar 24 22:35 dst.txt
-rw-r--r--. 1 root 214 Mar 27 23:34 mysql.ini
-rw-r--r--. 1 root 42 Mar 26 21:03 ser
-rw-r--r--. 1 root 51 Mar 27 19:57 ser.txt
drwxr-xr-x. 2 root 90 Mar 28 11:38 src/
-rw-r--r--. 1 root 9 Mar 24 22:12 src.txt
-rw-r--r--. 1 root 194 Mar 28 10:24 test.csv
-rw-r--r--. 1 root 180 Mar 27 21:20 test.ini
In [440]: shutil.move('dst1', 'dst')
Out[440]: 'dst'
In [441]: ll
total 28
drwxr-xr-x. 3 root 15 Mar 25 20:42 a/
drwxr-xr-x. 3 root 15 Mar 25 20:42 dest/
drwxr-xr-x. 2 root 48 Mar 28 11:38 dst/
-rw-r--r--. 1 root 9 Mar 24 22:35 dst.txt
-rw-r--r--. 1 root 214 Mar 27 23:34 mysql.ini
-rw-r--r--. 1 root 42 Mar 26 21:03 ser
-rw-r--r--. 1 root 51 Mar 27 19:57 ser.txt
drwxr-xr-x. 2 root 90 Mar 28 11:38 src/
-rw-r--r--. 1 root 9 Mar 24 22:12 src.txt
-rw-r--r--. 1 root 194 Mar 28 10:24 test.csv
-rw-r--r--. 1 root 180 Mar 27 21:20 test.ini
|