Python 移动或复制文件和目录

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python 示例