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()
可选地允许在复制过程中忽略某些文件和目录。为此,请提供一个忽略函数,该函数将目录名和文件名列表作为输入,并返回要忽略的名称列表作为结果。该示例显示在下面的代码中 -
代码#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()
复制目录的一个棘手问题是错误处理。例如,在复制过程中,函数可能会遇到符号链接断开、文件因权限问题而无法访问等。