1. 基本复制方法
采用给出2个文件对象的方式,在2个文件对象之间进行数据复制达到目的。
copyfileobj源码:
def copyfileobj(fsrc, fdst, length=16*1024): """copy data from file-like object fsrc to file-like object fdst""" while 1: buf = fsrc.read(length) if not buf: break fdst.write(buf)
分析:给出2个文件对象,通过读取原文件的内容,写入到新文件对象中,每次写入16KB。
这个方法实际是不常用的,而是为了我们的常用方式做准备的。注意这个方法这里没有流文件对象并没有关闭,即这确实只是一个基础方法。
Copyfile源码
def copyfile(src, dst): """Copy data from src to dst""" if _samefile(src, dst): raise Error, "`%s` and `%s` are the same file" % (src, dst) fsrc = None fdst = None try: fsrc = open(src, 'rb') fdst = open(dst, 'wb') copyfileobj(fsrc, fdst) finally: if fdst: fdst.close() if fsrc: fsrc.close()
这里代码没有任何难度,读取2个文件对象,调用刚才的copyfileobject对象。
测试.
条件:
E:\test\a文件夹下有一个文件jquery.min.js
E:\test\b下没有任何文件,但必须指定一个文件名
#! -*- encoding:utf-8 -*- import shutil shutil.copyfile("E:\\test\\a\\jquery.min.js", "E:\\test\\b\\jquery.min.js")
执行结果在E:\test\b目录下生成了一个名为jquery.min.js的文件。
外部调用方法
Copy源码
def copy(src, dst): """Copy data and mode bits ("cp src dst"). The destination may be a directory. """ if os.path.isdir(dst): dst = os.path.join(dst, os.path.basename(src)) copyfile(src, dst) copymode(src, dst)
可以看到这里有有趣的一行注释copy data and mode bits(“cp src dst”)复制文件内容的执行模式,完成的功能类似于cp src dst,在linux中不就是这个命令么,当然linux最终底层怎么实现的不得而知。 猜测也差不了多少。
代码解释,这里有一个条件,即如果dst是文件夹,而不是文件对象,那么就使用原来文件的文件名。即这个copy方法可以不用管是否拷贝对象是否是一个完整路径,文件夹也行,只不过文件夹的话,就以原来的文件名为新文件的文件名了。
测试,将刚才上个测试程序b文件夹中的文件清除,可以执行下面程序。会有新文件复制成功。
#! -*- encoding:utf-8 -*- import shutil shutil.copy("E:\\test\\a\\jquery.min.js", "E:\\test\\b")
Copy2源码
def copy2(src, dst): """Copy data and all stat info ("cp -p src dst"). The destination may be a directory. """ if os.path.isdir(dst): dst = os.path.join(dst, os.path.basename(src)) copyfile(src, dst) copystat(src, dst)
对比copy和copy2,发现只有copyfile下面的方法变了,而注释变成了cp –p src dst,熟悉linux的同学应该了解各种参数意义。
这里将原有文件的所有属性状态都copy过去了
Copytree源码
def copytree(src, dst, symlinks = False , ignore = None ):
names = os.listdir(src)
if ignore is not None :
ignored_names = ignore(src, names)
else :
ignored_names = set ()
os.makedirs(dst)
errors = []
for name in names:
if name in ignored_names:
continue
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try :
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks, ignore)
else :
copy2(srcname, dstname)
# XXX What about devices, sockets etc.?
except (IOError, os.error), why:
errors.append((srcname, dstname, str (why)))
# catch the Error from the recursive copytree so that we can
# continue with other files
except Error, err:
errors.extend(err.args[ 0 ])
try :
copystat(src, dst)
except OSError, why:
if WindowsError is not None and isinstance (why, WindowsError):
# Copying file access times may fail on Windows
pass
else :
errors.extend((src, dst, str (why)))
if errors:
raise Error, errors
|
该方法给出一个原始文件夹系统,下面可以有N个文件夹和文件,给出dst,即给出你想copy的路径的根路径,注意,这个根路径当前是必须不存在的,源码中标注红色部分,如果存在,会产生错误。这一点上,感觉该做一个条件判断的,可惜没做。当然不是大问题。有点吹毛求疵了。
测试:
E:\test\a 在a 目录下任意新建文件夹和文件,N多层次,test下也只有a这个文件夹。
#! -*- encoding:utf-8 -*- import shutil shutil.copytree("E:\\test\\a", "E:\\test\\b")
执行后会在test文件夹下多出一个b文件夹,并且b文件夹下有a文件夹下的所有内容.
Rmtree源码
def rmtree(path, ignore_errors=False, onerror=None): if ignore_errors: def onerror(*args): pass elif onerror is None: def onerror(*args): raise try: if os.path.islink(path): # symlinks to directories are forbidden, see bug #1669 raise OSError("Cannot call rmtree on a symbolic link") except OSError: onerror(os.path.islink, path, sys.exc_info()) # can't continue even if onerror hook returns return names = [] try: names = os.listdir(path) except os.error, err: onerror(os.listdir, path, sys.exc_info()) for name in names: fullname = os.path.join(path, name) try: mode = os.lstat(fullname).st_mode except os.error: mode = 0 if stat.S_ISDIR(mode): rmtree(fullname, ignore_errors, onerror) else: try: os.remove(fullname) except os.error, err: onerror(os.remove, fullname, sys.exc_info()) try: os.rmdir(path) except os.error: onerror(os.rmdir, path, sys.exc_info())
我想看名字你就该知道这个方法是干嘛的了。
刚才copytree执行成功后立即执行下面的代码:
#! -*- encoding:utf-8 -*- import shutil shutil.rmtree("E:\\test\\b")
可以发现b文件夹连同下面的文件都消失了。
Move源码
def move(src, dst): real_dst = dst if os.path.isdir(dst): real_dst = os.path.join(dst, _basename(src)) if os.path.exists(real_dst): raise Error, "Destination path '%s' already exists" % real_dst try: os.rename(src, real_dst) except OSError: if os.path.isdir(src): if destinsrc(src, dst): raise Error, "Cannot move a directory '%s' into itself '%s'." % (src, dst) copytree(src, real_dst, symlinks=True) rmtree(src) else: copy2(src, real_dst) os.unlink(src)
同上,看名字就知道的功能,类似于windows的ctrl+x->ctrl+v操作。
测试。
执行完rmtree后,test目录只有一个a文件夹,执行下面程序,可以看到a文件夹没有了,取而代之的是b文件夹下有a文件夹的所有内容。有点想os.rename了,但是只是因为我将这2个测试文件都放在了一起而已,即他能比较笨的完成os.rename的功能,但os.rename不可能会做move的功能。
#! -*- encoding:utf-8 -*- import shutil shutil.move("E:\\test\\a", "E:\\test\\b")
相关推荐
Python中的`shutil`模块是高级的文件操作工具,提供了许多功能,如文件拷贝、文件夹处理、压缩包管理等。以下是对`shutil`模块中关键知识点的详细解释: 1. **`shutil.copyfile(src, dst)`**: 这个函数用于拷贝...
本章节介绍sys模块以及shutil模块,分享给刚学python的小伙伴,一起学习,共同进步 sys模块 import sys # 获取python的版本信息 print(sys.version) print(sys.argv) # 退出 sys.exit(1) shutil模块 import shutil ...
Python 文件处理 15_shutil模块_文件和目录拷贝.mp4
### Python标准库shutil模块使用方法解析 在Python的标准库中,`shutil`模块提供了高级操作文件的函数,如复制、移动、删除文件或文件夹等。这对于处理大量文件时非常有用。本文将详细介绍`shutil`模块中的几个常用...
### Python中shutil模块的常用文件操作函数用法示例详解 #### 概述 `shutil`模块作为Python标准库的一部分,为开发者提供了比`os`模块更加强大的文件和目录操作功能。该模块主要关注于文件级别的高级操作,如文件的...
高级的文件,文件夹,压缩包的处理模块,也主要用于文件的拷贝 shutil.copyfileobj(fsrc,fdst[,length]): 将文件的内容拷贝到另一个文件(可以指定length长度进行拷贝) import shutil shutil.copyfileobj(open('old....
Python的`shutil`模块是高级文件操作工具,它提供了许多在`os`模块中未包含的功能,如文件和文件夹的移动、复制、打包、压缩和解压等。这个模块设计用于处理复杂的文件操作场景,让编程人员能更方便地进行文件管理。...
本文实例讲述了Python shutil模块用法。分享给大家供大家参考,具体如下: shutil模块 主要作用与拷贝文件用的。 1.shutil.copyfileobj(文件1,文件2):将文件1的数据覆盖copy给文件2。 import shutil f1 = open(1....
这是使用python os和shutil库设计的更新目录工具, 可更新被修改过的目录, 适用于文件备份, 简便易用, 解决了备份文件夹时需要复制整个文件夹的问题。 该程序目前已修复多个bug。 用法: 更新文件工具.py [源目录] ...
该资源包含便捷复制文件、扫描目录内文件、更新目录中文件等工具; 各工具都有配置文件(config.ini), 可根据需要修改。其中,更新文件工具.py 解决了备份文件夹时需要复制整个文件夹的问题。 适合新手、中高级程序员...
【Python之shutil模块使用方法】 在Python编程中,shutil模块是一个非常实用的工具,提供了许多高级的文件和文件夹操作,如拷贝、移动、删除、打包和压缩等。下面我们将详细探讨shutil模块的各项功能。 1. **...
### Python的shutil模块中文件的复制操作函数详解 在Python中,`shutil`模块提供了高级别的文件操作服务,其功能比`os`模块更为强大。本篇文章将重点介绍`shutil`模块中用于文件复制操作的主要函数:`copy()`, `...
shutil模块是Python标准库的一部分,它扩展了os模块的功能,提供了一系列高级接口来处理文件和目录。例如,shutil模块支持文件和目录的复制、移动、删除以及压缩和解压缩操作。下面是一些基本用法: 1. 复制文件:`...
### Python中shutil模块的学习笔记教程 #### 一、引言 在Python中,`shutil`模块提供了高级别的文件操作服务,它基于标准库中的其他底层文件操作接口进行了封装,使得开发人员能够更加方便地处理文件和目录级别的...
在Python编程中,`shutil`模块是一个非常实用的工具,它提供了许多高级的文件和文件集合操作。本文将深入探讨如何使用`shutil`模块实现文件和目录的拷贝、移动、删除以及压缩等操作。 1. `shutil.copyfileobj()`: ...