python脚本管理平台_马克的Python学习笔记#实用脚本和系统管理3

拷贝和移动文件目录

我们需要拷贝或移动文件和目录,但是我们不想通过调用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)

这些函数的参数全都是字符串,用来提供文件或者是目录的名称。如同注释中说明的那样,这些函数的底层定义就是在舱室模仿类似的unix命令。

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

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

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

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

def ignore_pyc_files(dirname, filenames):

return [name in filenames if name.endswith('.pyc')]

shutil.copytree(src, dst, ignore=ignore_pyc_files)

使用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'

>>>

使用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)

创建和解压归档文件

shutil模块拥有两个函数——make_archive()和unpack_archive()可派上用场。 例如:

>>> import shutil

>>> shutil.unpack_archive('Python-3.3.0.tgz')

>>> shutil.make_archive('py33','zip','Python-3.3.0')

'/Users/beazley/Downloads/py33.zip'

>>>

make_archive()的第二个参数是期望的输出格式。 可以使用get_archive_formats()获取所有支持的归档格式列表。例如:

>>> shutil.get_archive_formats()

[('bztar', "bzip2'ed tar-file"), ('gztar', "gzip'ed tar-file"),

('tar', 'uncompressed tar file'), ('zip', 'ZIP file')]

>>>

Python还有其他的模块可用来处理多种归档格式(比如tarfile, zipfile, gzip, bz2)的底层细节。 不过,如果你仅仅只是要创建或提取某个归档,就没有必要使用底层库了。 可以直接使用shutil中的这些高层函数。

参考书目:

《Python CookBook》作者:【美】 David Beazley, Brian K. Jones

Python 3.0.0文档:Python Cookbook 3rd Edition Documentation​python3-cookbook.readthedocs.io

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值