Python 移动或复制文件和目录
假设我们想复制或移动文件和目录,但又不想通过调用shell命令来实现。shutil模块具有用于复制文件和目录的可移植函数实现。
示例1
使用shutil 模块
import shutil
# Copy src to dst. (cp src dst)
shutil.copy(src, dst)
# Copy files, but preserve metadata (cp -p src dst)
shutil.copy2(src, dst)
# Copy directory tree (cp -R src dst)
shutil.copytree(src, dst)
# Move src to dst (mv src dst)
shutil.move(src, dst)
这些函数的参数都是提供文件或目录名的字符串。底层语义试图模拟类似Unix命令的语义,如注释中所示。默认情况下,符号链接后面跟着这些命令。例如,如果源文件是符号链接,那么目标文件将是链接指向的文件的副本。
要复制符号链接,请提供如下代码所示的follow_symlinks关键字参数:
示例2
shutil.copy2(src, dst, follow_symlinks = False)
# To preserve symbolic links in copied directories
shutil.copytree(src, dst, symlinks = True)
copytree()可选地允许在复制过程中忽略某些文件和目录。为此,提供一个ignore函数,该函数接受目录名和文件名列表作为输入,并返回要忽略的名称列表。示例如下面的代码所示
示例3
def ignore_pyc_files(dirname, filenames):
return [name in filenames if name.endswith('.pyc')]
shutil.copytree(src, dst, ignore = ignore_pyc_files)
由于忽略文件名模式是很常见的,因此已经提供了一个实用函数ignore_patterns()来执行此操作,如下面的代码所示。
示例4
shutil.copytree(src, dst, ignore = shutil.ignore_patterns('*~', '*.pyc'))
它是如何工作的?
- 使用shutil复制文件和目录非常简单。
- 但是,关于文件元数据的一个注意事项是,copy2()等函数只会尽最大努力保存这些数据。
- 基本信息(如访问时间、创建时间和权限)将始终保留,但是所有者、acl、资源分叉和其他扩展文件元数据的保存可能有效,也可能无效,这取决于底层操作系统和用户自己的访问权限。
- 用户可能不想使用shutil.copytree()这样的函数来执行系统备份。
在处理文件名时,确保使用os.path中的函数以获得最大的可移植性(特别是在同时使用Unix和Windows时)。
示例5
filename = '/Users/gfg/programs/abc.py'
import os.path
os.path.basename(filename)
'abc.py'
os.path.dirname(filename)
'/Users/gfg/programs'
os.path.split(filename)
('/Users/gfg/programs', 'abc.py')
os.path.join('/new/dir', os.path.basename(filename))
'/new/dir/spam.py'
os.path.expanduser('~/gfg/programs/spam.py')
'/Users/gfg/programs/abc.py'
使用copytree()复制目录的一个技巧是错误的处理。例如,在复制过程中,函数可能会遇到断开的符号链接,由于权限问题而无法访问的文件,等等。