Weibw's World Weibw's World
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Weibw

一个没有梦想的咸鱼
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《Flask》

  • 《Python Cookbook》第三版

    • 第一章:数据结构与算法

    • 第二章:字符串和文本

    • 第三章:数字日期和时间

    • 第四章:迭代器与生成器

    • 第五章:文件与IO

    • 第六章:数据编码和处理

    • 第七章:函数

    • 第八章:类与对象

    • 第九章:元编程

    • 第十章:模块与包

    • 第十一章:网络与Web编程

    • 第十二章:并发编程

    • 第十三章:脚本编程与系统管理

      • 通过重定向-管道-文件接受输入
      • 终止程序并给出错误信息
      • 解析命令行选项
      • 运行时弹出密码输入提示
      • 获取终端的大小
      • 执行外部命令并获取它的输出
      • 复制或者移动文件和目录
        • 问题
        • 解决方案
        • 讨论
      • 创建和解压归档文件
      • 通过文件名查找文件
      • 读取配置文件
      • 给简单脚本增加日志功能
      • 给函数库增加日志功能
      • 实现一个计时器
      • 限制内存和CPU的使用量
      • 启动一个WEB浏览器
    • 第十四章:测试、调试和异常

    • 第十五章:C语言扩展

  • Python基础

  • Python
  • 《Python Cookbook》第三版
  • 第十三章:脚本编程与系统管理
weibw
2022-01-18

复制或者移动文件和目录

# 问题

你想要复制或移动文件和目录,但是又不想调用shell命令。

# 解决方案

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)
1
2
3
4
5
6
7
8
9
10
11
12
13

这些函数的参数都是字符串形式的文件或目录名。 底层语义模拟了类似的Unix命令,如上面的注释部分。

默认情况下,对于符号链接而已这些命令处理的是它指向的东西。 例如,如果源文件是一个符号链接,那么目标文件将会是符号链接指向的文件。 如果你只想复制符号链接本身,那么需要指定关键字参数 follow_symlinks ,如下:

如果你想保留被复制目录中的符号链接,像这样做:

shutil.copytree(src, dst, symlinks=True)
1

copytree() 可以让你在复制过程中选择性的忽略某些文件或目录。 你可以提供一个忽略函数,接受一个目录名和文件名列表作为输入,返回一个忽略的名称列表。例如:

def ignore_pyc_files(dirname, filenames):
    return [name in filenames if name.endswith('.pyc')]

shutil.copytree(src, dst, ignore=ignore_pyc_files)
1
2
3
4

由于忽略某种模式的文件名是很常见的,因此一个便捷的函数 ignore_patterns() 已经包含在里面了。例如:

shutil.copytree(src, dst, ignore=shutil.ignore_patterns('*~', '*.pyc'))
1

# 讨论

使用 shutil 复制文件和目录也忒简单了点吧。 不过,对于文件元数据信息,copy2() 这样的函数只能尽自己最大能力来保留它。 访问时间、创建时间和权限这些基本信息会被保留, 但是对于所有者、ACLs、资源fork和其他更深层次的文件元信息就说不准了, 这个还得依赖于底层操作系统类型和用户所拥有的访问权限。 你通常不会去使用 shutil.copytree() 函数来执行系统备份。 当处理文件名的时候,最好使用 os.path 中的函数来确保最大的可移植性(特别是同时要适用于Unix和Windows)。 例如:

>>> filename = '/Users/guido/programs/spam.py'
>>> import os.path
>>> os.path.basename(filename)
'spam.py'
>>> os.path.dirname(filename)
'/Users/guido/programs'
>>> os.path.split(filename)
('/Users/guido/programs', 'spam.py')
>>> os.path.join('/new/dir', os.path.basename(filename))
'/new/dir/spam.py'
>>> os.path.expanduser('~/guido/programs/spam.py')
'/Users/guido/programs/spam.py'
>>>
1
2
3
4
5
6
7
8
9
10
11
12
13

使用 copytree() 复制文件夹的一个棘手的问题是对于错误的处理。 例如,在复制过程中,函数可能会碰到损坏的符号链接,因为权限无法访问文件的问题等等。 为了解决这个问题,所有碰到的问题会被收集到一个列表中并打包为一个单独的异常,到了最后再抛出。 下面是一个例子:

try:
    shutil.copytree(src, dst)
except shutil.Error as e:
    for src, dst, msg in e.args[0]:
         # src is source name
         # dst is destination name
         # msg is error message from exception
         print(dst, src, msg)
1
2
3
4
5
6
7
8

如果你提供关键字参数 ignore_dangling_symlinks=True , 这时候 copytree() 会忽略掉无效符号链接。

本节演示的这些函数都是最常见的。不过,shutil 还有更多的和复制数据相关的操作。 它的文档很值得一看,参考 Python documentation (opens new window)

编辑 (opens new window)
上次更新: 2023/10/13, 17:39:25
执行外部命令并获取它的输出
创建和解压归档文件

← 执行外部命令并获取它的输出 创建和解压归档文件→

最近更新
01
牛客网非技术快速入门SQL练习题
03-08
02
其他日常SQL题
03-07
03
用户与权限管理
03-05
更多文章>
Theme by Vdoing | Copyright © 2021-2023 | Weibw | 辽ICP备18015889号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式