📜  Python|移动或复制文件和目录

📅  最后修改于: 2022-05-13 01:55:31.041000             🧑  作者: Mango

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()复制目录的一个棘手问题是错误处理。例如,在复制过程中,函数可能会遇到符号链接断开、文件因权限问题而无法访问等。