返回顶部
首页 > 资讯 > 后端开发 > Python >Python 模版(二)
  • 960
分享到

Python 模版(二)

模版Python 2023-01-31 01:01:54 960人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

六、shutil高级的文件、文件夹、压缩包处理模块shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中,可以部分内容def copyfileobj(fsrc, fdst, length

六、shutil

高级的文件、文件夹、压缩包处理模块

shutil.copyfileobj(fsrc, fdst[, length])

将文件内容拷贝到另一个文件中,可以部分内容

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)

shutil.copyfile(src, dst)

拷贝文件

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))
    for fn in [src, dst]:
        try:
            st = os.stat(fn)
        except OSError:
            # File most likely does not exist
            pass
        else:
            # XXX What about other special files? (Sockets, devices...)
            if stat.S_ISFIFO(st.st_mode):
                raise SpecialFileError("`%s` is a named pipe" % fn)
    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)

shutil.copymode(src, dst)

仅拷贝权限。内容、组、用户均不变

def copymode(src, dst):
    """Copy mode bits from src to dst"""
    if hasattr(os, 'chmod'):
        st = os.stat(src)
        mode = stat.S_IMODE(st.st_mode)
        os.chmod(dst, mode)

shutil.copystat(src, dst)

拷贝状态的信息,包括:mode bits, atime, mtime, flags

def copystat(src, dst):
    """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
    st = os.stat(src)
    mode = stat.S_IMODE(st.st_mode)
    if hasattr(os, 'utime'):
        os.utime(dst, (st.st_atime, st.st_mtime))
    if hasattr(os, 'chmod'):
        os.chmod(dst, mode)
    if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
        try:
            os.chflags(dst, st.st_flags)
        except OSError, why:
            for err in 'EOPNOTSUPP', 'ENOTSUP':
                if hasattr(errno, err) and why.errno == getattr(errno, err):
                    break
            else:
                raise

shutil.copy(src, dst)

拷贝文件和权限

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)

shutil.copy2(src, dst)

拷贝文件和状态信息

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)

shutil.ignore_patterns(*patterns)

shutil.copytree(src, dst, symlinks=False, ignore=None)

递归的去拷贝文件

例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))

def ignore_patterns(*patterns):
    """Function that can be used as copytree() ignore parameter.
    Patterns is a sequence of glob-style patterns
    that are used to exclude files"""
    def _ignore_patterns(path, names):
        ignored_names = []
        for pattern in patterns:
            ignored_names.extend(fnmatch.filter(names, pattern))
        return set(ignored_names)
    return _ignore_patterns
def copytree(src, dst, symlinks=False, ignore=None):
    """Recursively copy a directory tree using copy2().
    The destination directory must not already exist.
    If exception(s) occur, an Error is raised with a list of reasons.
    If the optional symlinks flag is true, symbolic links in the
    source tree result in symbolic links in the destination tree; if
    it is false, the contents of the files pointed to by symbolic
    links are copied.
    The optional ignore argument is a callable. If given, it
    is called with the `src` parameter, which is the directory
    being visited by copytree(), and `names` which is the list of
    `src` contents, as returned by os.listdir():
        callable(src, names) -> ignored_names
    Since copytree() is called recursively, the callable will be
    called once for each directory that is copied. It returns a
    list of names relative to the `src` directory that should
    not be copied.
    XXX Consider this example code rather than the ultimate tool.
    """
    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:
                # Will raise a SpecialFileError for unsupported file types
                copy2(srcname, dstname)
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except Error, err:
            errors.extend(err.args[0])
        except EnvironmentError, why:
            errors.append((srcname, dstname, str(why)))
    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.append((src, dst, str(why)))
    if errors:
        raise Error, errors

shutil.rmtree(path[, ignore_errors[, onerror]])

递归的去删除文件

def rmtree(path, ignore_errors=False, onerror=None):
    """Recursively delete a directory tree.
    If ignore_errors is set, errors are ignored; otherwise, if onerror
    is set, it is called to handle the error with arguments (func,
    path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
    path is the argument to that function that caused it to fail; and
    exc_info is a tuple returned by sys.exc_info().  If ignore_errors
    is false and onerror is None, an exception is raised.
    """
    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())

shutil.move(src, dst)

递归的去移动文件

def move(src, dst):
    """Recursively move a file or directory to another location. This is
    similar to the Unix "mv" command.
    If the destination is a directory or a symlink to a directory, the source
    is moved inside the directory. The destination path must not already
    exist.
    If the destination already exists but is not a directory, it may be
    overwritten depending on os.rename() semantics.
    If the destination is on our current filesystem, then rename() is used.
    Otherwise, src is copied to the destination and then removed.
    A lot more could be done here...  A look at a mv.c shows a lot of
    the issues this implementation glosses over.
    """
    real_dst = dst
    if os.path.isdir(dst):
        if _samefile(src, dst):
            # We might be on a case insensitive filesystem,
            # perfORM the rename anyway.
            os.rename(src, dst)
            return
        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)

shutil.make_archive(base_name, format,...)

创建压缩包并返回文件路径,例如:zip、tar

 base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,

 如:www                        =>保存至当前路径

 如:/Users/wulaoer/www =>保存至/Users/wulaoer/

 format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”

 root_dir: 要压缩的文件夹路径(默认当前目录)

 owner: 用户,默认当前用户

 group: 组,默认当前组

 logger: 用于记录日志,通常是logging.Logger对象

#将 /Users/wulaoer/Downloads/test 下的文件打包放置当前程序目录

import shutil
ret = shutil.make_arcHive("wwwwwwwwww", 'gztar', root_dir='/Users/wulaoer/Downloads/test')
 
 
#将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录
import shutil
ret = shutil.make_archive("/Users/wulaoer/wwwwwwwwww", 'gztar', root_dir='/Users/wulaoer/Downloads/test')
def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,
                 dry_run=0, owner=None, group=None, logger=None):
    """Create an archive file (eg. zip or tar).
    'base_name' is the name of the file to create, minus any format-specific
    extension; 'format' is the archive format: one of "zip", "tar", "bztar"
    or "gztar".
    'root_dir' is a directory that will be the root directory of the
    archive; ie. we typically chdir into 'root_dir' before creating the
    archive.  'base_dir' is the directory where we start archiving from;
    ie. 'base_dir' will be the common prefix of all files and
    directories in the archive.  'root_dir' and 'base_dir' both default
    to the current directory.  Returns the name of the archive file.
    'owner' and 'group' are used when creating a tar archive. By default,
    uses the current owner and group.
    """
    save_cwd = os.getcwd()
    if root_dir is not None:
        if logger is not None:
            logger.debug("changing into '%s'", root_dir)
        base_name = os.path.abspath(base_name)
        if not dry_run:
            os.chdir(root_dir)
    if base_dir is None:
        base_dir = os.curdir
    kwargs = {'dry_run': dry_run, 'logger': logger}
    try:
        format_info = _ARCHIVE_FORMATS[format]
    except KeyError:
        raise ValueError, "unknown archive format '%s'" % format
    func = format_info[0]
    for arg, val in format_info[1]:
        kwargs[arg] = val
    if format != 'zip':
        kwargs['owner'] = owner
        kwargs['group'] = group
    try:
        filename = func(base_name, base_dir, **kwargs)
    finally:
        if root_dir is not None:
            if logger is not None:
                logger.debug("changing back to '%s'", save_cwd)
            os.chdir(save_cwd)
    return filename

shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:

zipfile 压缩解压

import zipfile
# 压缩
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()
# 解压
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall()
z.close()

tarfile 压缩解压

import tarfile
# 压缩
tar = tarfile.open('your.tar','w')
tar.add('/Users/wupeiqi/PyCharmProjects/bbs2.zip', arcname='bbs2.zip')
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip')
tar.close()
# 解压
tar = tarfile.open('your.tar','r')
tar.extractall()  # 可设置解压地址
tar.close()


--结束END--

本文标题: Python 模版(二)

本文链接: https://lsjlt.com/news/183817.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python 模版(二)
    六、shutil高级的文件、文件夹、压缩包处理模块shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中,可以部分内容def copyfileobj(fsrc, fdst, length...
    99+
    2023-01-31
    模版 Python
  • Django 模版语法 二
    变量的过滤器(filter)的使用 过滤器:upper, lower, first, capfirst 在 views.py 中修改 from django.shortcuts import render # Create your v...
    99+
    2023-01-31
    模版 语法 Django
  • Python 模版(三)
    ZipFileclass ZipFile(object):     """ Class with methods to open, read, write, close, list zip files.     z = ZipFile(fi...
    99+
    2023-01-31
    模版 Python
  • Python 常用基础模块(二):os模块
    目录 一、os模块介绍二、路径介绍三、常用方法详解3.1 getcwd()方法——获取当前工作目录(字符串)3.2 listdir()方法——返回指定路径下的目录名和文件名3.3 makedi...
    99+
    2023-09-09
    python 开发语言
  • python音乐播放器第二版
        此代码是上一期的改版   需要用到的Python库有 1.pygame 2.time 3.xmusic(我自己写的用来做音乐索引) 4.colorama(美观) 推荐使用pip安装  方法: pip install 库   ...
    99+
    2023-01-30
    播放器 音乐 python
  • Python学习 :常用模块(二)
    常用模块(二) 四、os模块 os模块是与操作系统交互的一个接口,用于对操作系统进行调用 os.getcwd() # 提供当前工作目录 os.chdir() # 改变当前工作目录 os.curdir() # 返回当前目录('.'...
    99+
    2023-01-30
    模块 常用 Python
  • 第一模块:Python基础(二)
    目录 1.变量 常量 2.用户交互和注释 程序交互 注释 字符串 ...
    99+
    2023-01-31
    模块 基础 Python
  • python一二三【warning模块使
    warning模块使用目的 和exception异常要求用户立刻进行处理不同,warning通常用于提示用户一些错误或者过时的用法。 case scrapy源码中用到了继承了Warning类创建了一个提醒对象ScrapyDepre...
    99+
    2023-01-31
    二三 模块 python
  • 用Python进行数学建模(二)
    一、微分方程模型 微分方程是描述系统的状态随时间和空间演化的数学工具。物理中许多涉及变力的运动学、动力学问题,如空气的阻力为速度函数的落体运动等问题,很多可以用微分方程求解。微分方程在化学、工程学、经...
    99+
    2023-09-08
    python 机器学习 算法
  • Python二分查找+字符串模板+textwrap模块,
    目录二分查找字符串模板textwrap 模块按照空格统计词组个数用 “0” 填充字符串前言: 这个系列的专栏是为了保持 Python 手感而创建的,也可以用来...
    99+
    2024-04-02
  • python模块降版本命令
    python -m pip install --upgrade pip==9.0.3 ...
    99+
    2023-01-31
    模块 命令 版本
  • Python入门教程(二十六)Python的模块
    目录什么是模块?创建模块使用模块模块中的变量为模块命名重命名模块内建模块使用 dir() 函数从模块导入什么是模块? 请思考与代码库类似的模块。 模块是包含一组函数的文件,希望在应用...
    99+
    2023-05-17
    Python 入门 Python 模块
  • 学习python的第二十天(json模块
    1.josn模块(用于指定数据类型文件快速读写修改) 1.指定的数据类型 dict(字典) str(字符串) int/float(整型/浮点型) bool中的False,True,None 2.dumps/loads loads 用于内...
    99+
    2023-01-31
    十天 模块 python
  • 学习python的第二十天(time模块
    1.三种时间的显示样式 1.时间戳 1.相关函数 1.time() 2.显示样式 import time print(time.time()) #1560150343.5837357 距离计算机元年1970年1月1日00:00:0的过...
    99+
    2023-01-31
    十天 模块 python
  • 详解python的二进制转化模块
    在pyton中,通过struct模块来对二进制进行转换,主要包括两大类函数,即用于打包的pack和用于解包的unpack。 其中,struct.pack的输入格式为struct.pa...
    99+
    2024-04-02
  • 学习python的第二十天(os模块,s
    1.os模块(功能类似操作系统与文件交互) 1.常用模块功能 1.创建文件 1.mkdir 2.移除文件 1.remove 删除指定文件 2.rmdir 删除单级空目录,若目录不为空则无法删除 3.removedirs 若目录为空,则删...
    99+
    2023-01-31
    十天 模块 python
  • Python二分查找+字符串模板+textwrap模块实例分析
    今天小编给大家分享一下Python二分查找+字符串模板+textwrap模块实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-06-30
  • python(二)
    1.int( )范围大小转换。    @整型的创建,声明。    创建一个整型和给变量赋值的过程是一样的。      a =123 等号左边是变量名,右边是要赋的值,就是這么的简单。      @整型的特点      对于整型来说,复制的时...
    99+
    2023-01-31
    python
  • Python实现二分查找与bisect模块详解
    前言 其实Python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index() 方法,其时间复杂度为O(n) 。对于大数据量,则可以用二分查找进行优化。 ...
    99+
    2022-06-04
    详解 模块 Python
  • python中的bisect模块与二分查找详情
    目录1.bisect模块概述2.bisect模块的函数详解2.1 bisect.bisect*()方法2.2 bisect.insort*()方法3.python中的二分查找3.1 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作