`
这些年
  • 浏览: 389069 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Shutil模块介绍 (转)

 
阅读更多

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模块.docx

    shutil.copyfile(src, dst) 拷贝文件 1 shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在 shutil.copymode(src, dst) 仅拷贝权限。内容、组、用户均不变 1 shutil.copymode('f1.log', 'f2.log') #目标文件...

    python3之sys模块以及shutil模块

    本章节介绍sys模块以及shutil模块,分享给刚学python的小伙伴,一起学习,共同进步 sys模块 import sys # 获取python的版本信息 print(sys.version) print(sys.argv) # 退出 sys.exit(1) shutil模块 import shutil ...

    Python 文件处理 15_shutil模块_文件和目录拷贝.mp4

    Python 文件处理 15_shutil模块_文件和目录拷贝.mp4

    Python标准库shutil模块使用方法解析

    主要介绍了Python标准库shutil模块使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Python程序设计:os模块与shuilt模块.pptx

    shutil模块;shutil模块;shutil模块;shutil.copytree(源目录,目标目录):可以递归copy多个目录到指定目录下。 shutil.rmtree(目标目录):可以递归删除目录下的目录及文件。 shutil.move(源文件,指定路径):递归移动...

    详解Python_shutil模块

    高级的文件,文件夹,压缩包的处理模块,也主要用于文件的拷贝 shutil.copyfileobj(fsrc,fdst[,length]): 将文件的内容拷贝到另一个文件(可以指定length长度进行拷贝) import shutil shutil.copyfileobj(open('old....

    Python中shutil模块的常用文件操作函数用法示例

    shutil模块提供比OS模块更强大的本地文件操作功能,包括文件的压缩和解压缩等,下面我们就来列举Python中shutil模块的常用文件操作函数用法示例:

    浅谈Python中os模块及shutil模块的常规操作

    主要介绍了浅谈Python中os模块及shutil模块的常规操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    简单了解python shutil模块原理及使用方法

    shutil –High-level file operations 高级的文件操作模块 os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录…… 但是,os文件的操作还应该包含...

    Python shutil模块用法实例分析

    本文实例讲述了Python shutil模块用法。分享给大家供大家参考,具体如下: shutil模块 主要作用与拷贝文件用的。 1.shutil.copyfileobj(文件1,文件2):将文件1的数据覆盖copy给文件2。 import shutil f1 = open(1....

    Python的shutil模块中文件的复制操作函数详解

    shutil被定义为Python中的一个高级的文件操作模块,拥有比os模块中更强大的函数,这里我们就来看一下Python的shutil模块中文件的复制操作函数详解

    Python os shutil模块设计更新目录小工具

    这是使用python os和shutil库设计的更新目录工具, 可更新被修改过的目录, 适用于文件备份, 简便易用, 解决了备份文件夹时需要复制整个文件夹的问题。 该程序目前已修复多个bug。 用法: 更新文件工具.py [源目录] ...

    Python os shutil模块设计操作文件工具合集

    该资源包含便捷复制文件、扫描目录内文件、更新目录中文件等工具; 各工具都有配置文件(config.ini), 可根据需要修改。其中,更新文件工具.py 解决了备份文件夹时需要复制整个文件夹的问题。 适合新手、中高级程序员...

    Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析

    主要介绍了Python3.5内置模块之os模块、sys模块、shutil模块用法,结合实例形式分析了Python os模块、sys模块及shutil模块针对文件、路径等相关操作技巧,需要的朋友可以参考下

    python之shutil模块使用方法(三分钟了解)

    文章目录shutil模块1.1简介1.2 作用及作用范围1.3文件拷贝示例1.3.1、shutil.copyfileobj() ==> 将文件的内容拷贝到另一个文件(可以指定length拷贝)1.3.2、shutil.copyfile(src, dst) ==> 拷贝文件1.3.3、...

    Python使用shutil模块实现文件拷贝

    主要介绍了Python使用shutil模块实现文件拷贝,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics