-- --High-level file operations  高级的文件操作模块。

os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录……  但是,os文件的操作还应该包含移动 复制  打包 压缩 解压等操作,这些os模块都没有提供。

而本章所讲的shutil则就是对os中文件操作的补充。--移动 复制  打包 压缩 解压,

shutil功能:

1  shutil.copyfileobj(fsrc, fdst[, length=16*1024])    #copy文件内容到另一个文件,可以copy指定大小的内容

#先来看看其源代码。

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 notbuf:breakfdst.write(buf)#注意! 在其中fsrc,fdst都是文件对象,都需要打开后才能进行复制操作

importshutil

f1=open('name','r')

f2=open('name_copy','w+')

shutil.copyfileobj(f1,f2,length=16*1024)

View Code

2  shutil.copyfile(src,dst)   #copy文件内容,是不是感觉上面的文件复制很麻烦?还需要自己手动用open函数打开文件,在这里就不需要了,事实上,copyfile调用了copyfileobj

def copyfile(src, dst, *, follow_symlinks=True):"""Copy data from src to dst.

If follow_symlinks is not set and src is a symbolic link, a new

symlink will be created instead of copying the file it points to."""

if_samefile(src, dst):raise SameFileError("{!r} and {!r} are the same file".format(src, dst))for fn in[src, dst]:try:

st=os.stat(fn)exceptOSError:#File most likely does not exist

pass

else:#XXX What about other special files? (sockets, devices...)

ifstat.S_ISFIFO(st.st_mode):raise SpecialFileError("`%s` is a named pipe" %fn)if not follow_symlinks andos.path.islink(src):

os.symlink(os.readlink(src), dst)else:

with open(src,'rb') as fsrc:

with open(dst,'wb') as fdst:

copyfileobj(fsrc, fdst)returndst

查看源代码

查看源码

shutil.copyfile('name','name_copy_2')#一句就可以实现复制文件内容

实例

3  shutil.copymode(src,dst)   #仅copy权限,不更改文件内容,组和用户。

def copymode(src, dst, *, follow_symlinks=True):"""Copy mode bits from src to dst.

If follow_symlinks is not set, symlinks aren't followed if and only

if both `src` and `dst` are symlinks. If `lchmod` isn't available

(e.g. Linux) this method does nothing."""

if not follow_symlinks and os.path.islink(src) andos.path.islink(dst):if hasattr(os, 'lchmod'):

stat_func, chmod_func=os.lstat, os.lchmodelse:return

elif hasattr(os, 'chmod'):

stat_func, chmod_func=os.stat, os.chmodelse:returnst=stat_func(src)

chmod_func(dst, stat.S_IMODE(st.st_mode))

查看源代码

查看源码

#先看两个文件的权限

[root@slyoyo python_test]#ls -l

total 4

-rw-r--r--. 1 root root 79 May 14 05:17test1-rwxr-xr-x. 1 root root 0 May 14 19:10test2#运行命令

>>> importshutil>>> shutil.copymode('test1','test2')#查看结果

[root@slyoyo python_test]#ls -l

total 4

-rw-r--r--. 1 root root 79 May 14 05:17test1-rw-r--r--. 1 root root 0 May 14 19:10test2#当我们将目标文件换为一个不存在的文件时报错

>>> shutil.copymode('test1','test3')

Traceback (most recent call last):

File"", line 1, in File"/usr/local/python/lib/python3.4/shutil.py", line 132, incopymode

chmod_func(dst, stat.S_IMODE(st.st_mode))

FileNotFoundError: [Errno2] No such file or directory: 'test233'

实例

4  shutil.copystat(src,dst)    #复制所有的状态信息,包括权限,组,用户,时间等

def copystat(src, dst, *, follow_symlinks=True):"""Copy all stat info (mode bits, atime, mtime, flags) from src to dst.

If the optional flag `follow_symlinks` is not set, symlinks aren't followed if and

only if both `src` and `dst` are symlinks."""

def _nop(*args, ns=None, follow_symlinks=None):pass

#follow symlinks (aka don't not follow symlinks)

follow = follow_symlinks or not (os.path.islink(src) andos.path.islink(dst))iffollow:#use the real function if it exists

deflookup(name):returngetattr(os, name, _nop)else:#use the real function only if it exists

#*and* it supports follow_symlinks

deflookup(name):

fn=getattr(os, name, _nop)if fn inos.supports_follow_symlinks:returnfnreturn_nop

st= lookup("stat")(src, follow_symlinks=follow)

mode=stat.S_IMODE(st.st_mode)

lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns),

follow_symlinks=follow)try:

lookup("chmod")(dst, mode, follow_symlinks=follow)exceptNotImplementedError:#if we got a NotImplementedError, it's because

#* follow_symlinks=False,

#* lchown() is unavailable, and

#* either

#* fchownat() is unavailable or

#* fchownat() doesn't implement AT_SYMLINK_NOFOLLOW.

#(it returned ENOSUP.)

#therefore we're out of options--we simply cannot chown the

#symlink. give up, suppress the error.

#(which is what shutil always did in this circumstance.)

pass

if hasattr(st, 'st_flags'):try:

lookup("chflags")(dst, st.st_flags, follow_symlinks=follow)exceptOSError as why:for err in 'EOPNOTSUPP', 'ENOTSUP':if hasattr(errno, err) and why.errno ==getattr(errno, err):break

else:raise_copyxattr(src, dst, follow_symlinks=follow)

查看源代码

5  shutil.copy(src,dst)   #复制文件的内容以及权限,先copyfile后copymode

def copy(src, dst, *, follow_symlinks=True):"""Copy data and mode bits ("cp src dst"). Return the file's destination.

The destination may be a directory.

If follow_symlinks is false, symlinks won't be followed. This

resembles GNU's "cp -P src dst".

If source and destination are the same file, a SameFileError will be

raised."""

ifos.path.isdir(dst):

dst=os.path.join(dst, os.path.basename(src))

copyfile(src, dst, follow_symlinks=follow_symlinks)

copymode(src, dst, follow_symlinks=follow_symlinks)return dst

查看源代码

6  shutil.copy2(src,dst)    #复制文件的内容以及文件的所有状态信息。先copyfile后copystat

def copy2(src, dst, *, follow_symlinks=True):"""Copy data and all stat info ("cp -p src dst"). Return the file's

destination."

The destination may be a directory.

If follow_symlinks is false, symlinks won't be followed. This

resembles GNU's "cp -P src dst"."""

ifos.path.isdir(dst):

dst=os.path.join(dst, os.path.basename(src))

copyfile(src, dst, follow_symlinks=follow_symlinks)

copystat(src, dst, follow_symlinks=follow_symlinks)return dst

查看源代码

7  shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,ignore_dangling_symlinks=False)   #递归的复制文件内容及状态信息

def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,

ignore_dangling_symlinks=False):"""Recursively copy a directory tree.

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. If the file pointed by the symlink doesn't

exist, an exception will be added in the list of errors raised in

an Error exception at the end of the copy process.

You can set the optional ignore_dangling_symlinks flag to true if you

want to silence this exception. Notice that this has no effect on

platforms that don't support os.symlink.

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.

The optional copy_function argument is a callable that will be used

to copy each file. It will be called with the source path and the

destination path as arguments. By default, copy2() is used, but any

function that supports the same signature (like copy()) can be used."""names=os.listdir(src)if ignore is notNone:

ignored_names=ignore(src, names)else:

ignored_names=set()

os.makedirs(dst)

errors=[]for name innames:if name inignored_names:continuesrcname=os.path.join(src, name)

dstname=os.path.join(dst, name)try:ifos.path.islink(srcname):

linkto=os.readlink(srcname)ifsymlinks:#We can't just leave it to `copy_function` because legacy

#code with a custom `copy_function` may rely on copytree

#doing the right thing.

os.symlink(linkto, dstname)

copystat(srcname, dstname, follow_symlinks=notsymlinks)else:#ignore dangling symlink if the flag is on

if not os.path.exists(linkto) andignore_dangling_symlinks:continue

#otherwise let the copy occurs. copy2 will raise an error

ifos.path.isdir(srcname):

copytree(srcname, dstname, symlinks, ignore,

copy_function)else:

copy_function(srcname, dstname)elifos.path.isdir(srcname):

copytree(srcname, dstname, symlinks, ignore, copy_function)else:#Will raise a SpecialFileError for unsupported file types

copy_function(srcname, dstname)#catch the Error from the recursive copytree so that we can

#continue with other files

exceptError as err:

errors.extend(err.args[0])exceptOSError as why:

errors.append((srcname, dstname, str(why)))try:

copystat(src, dst)exceptOSError as why:#Copying file access times may fail on Windows

if getattr(why, 'winerror', None) isNone:

errors.append((src, dst, str(why)))iferrors:raiseError(errors)returndst#version vulnerable to race conditions

查看源代码

[root@slyoyo python_test]#tree copytree_test/

copytree_test/└── test

├── test1

├── test2

└── hahaha

[root@slyoyo test]#ls -l

total 0-rw-r--r--. 1 python python 0 May 14 19:36hahaha-rw-r--r--. 1 python python 0 May 14 19:36test1-rw-r--r--. 1 root root 0 May 14 19:36test2>>> shutil.copytree('copytree_test','copytree_copy')'copytree_copy'[root@slyoyo python_test]#ls -l

total 12drwxr-xr-x. 3 root root 4096 May 14 19:36copytree_copy

drwxr-xr-x. 3 root root 4096 May 14 19:36copytree_test-rw-r--r--. 1 python python 79 May 14 05:17test1-rw-r--r--. 1 root root 0 May 14 19:10test2

[root@slyoyo python_test]#tree copytree_copy/

copytree_copy/└── test

├── hahaha

├── test1

└── test2

实例

8  shutil.rmtree(path, ignore_errors=False, οnerrοr=None)   #递归地删除文件

def rmtree(path, ignore_errors=False, οnerrοr=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 platform and implementation dependent;

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."""

ifignore_errors:def onerror(*args):pass

elif onerror isNone:def onerror(*args):raise

if_use_fd_functions:#While the unsafe rmtree works fine on bytes, the fd based does not.

ifisinstance(path, bytes):

path=os.fsdecode(path)#Note: To guard against symlink races, we use the standard

#lstat()/open()/fstat() trick.

try:

orig_st=os.lstat(path)exceptException:

onerror(os.lstat, path, sys.exc_info())return

try:

fd=os.open(path, os.O_RDONLY)exceptException:

onerror(os.lstat, path, sys.exc_info())return

try:ifos.path.samestat(orig_st, os.fstat(fd)):

_rmtree_safe_fd(fd, path, onerror)try:

os.rmdir(path)exceptOSError:

onerror(os.rmdir, path, sys.exc_info())else:try:#symlinks to directories are forbidden, see bug #1669

raise OSError("Cannot call rmtree on a symbolic link")exceptOSError:

onerror(os.path.islink, path, sys.exc_info())finally:

os.close(fd)else:return_rmtree_unsafe(path, onerror)#Allow introspection of whether or not the hardening against symlink#attacks is supported on the current platform

rmtree.avoids_symlink_attacks = _use_fd_functions

查看源代码

9  shutil.move(src, dst)    #递归的移动文件

defmove(src, dst):"""Recursively move a file or directory to another location. This is

similar to the Unix "mv" command. Return the file or directory's

destination.

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. Symlinks are

recreated under the new name if os.rename() fails because of cross

filesystem renames.

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=dstifos.path.isdir(dst):if_samefile(src, dst):#We might be on a case insensitive filesystem,

#perform the rename anyway.

os.rename(src, dst)returnreal_dst=os.path.join(dst, _basename(src))ifos.path.exists(real_dst):raise Error("Destination path '%s' already exists" %real_dst)try:

os.rename(src, real_dst)exceptOSError:ifos.path.islink(src):

linkto=os.readlink(src)

os.symlink(linkto, real_dst)

os.unlink(src)elifos.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)return real_dst

查看源代码

10  make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None)  #压缩打包

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 notNone:if logger is notNone:

logger.debug("changing into '%s'", root_dir)

base_name=os.path.abspath(base_name)if notdry_run:

os.chdir(root_dir)if base_dir isNone:

base_dir=os.curdir

kwargs= {'dry_run': dry_run, 'logger': logger}try:

format_info=_ARCHIVE_FORMATS[format]exceptKeyError:raise ValueError("unknown archive format '%s'" %format)

func=format_info[0]for arg, val in format_info[1]:

kwargs[arg]=valif format != 'zip':

kwargs['owner'] =owner

kwargs['group'] =grouptry:

filename= func(base_name, base_dir, **kwargs)finally:if root_dir is notNone:if logger is notNone:

logger.debug("changing back to '%s'", save_cwd)

os.chdir(save_cwd)return filename

查看源代码

base_name:    压缩打包后的文件名或者路径名

format:          压缩或者打包格式    "zip", "tar", "bztar"or "gztar"

root_dir :         将哪个目录或者文件打包(也就是源文件)

>>> shutil.make_archive('tarball','gztar',root_dir='copytree_test')

[root@slyoyo python_test]#ls -l

total 12drwxr-xr-x. 3 root root 4096 May 14 19:36copytree_copy

drwxr-xr-x. 3 root root 4096 May 14 19:36copytree_test-rw-r--r--. 1 root root 0 May 14 21:12tarball.tar.gz-rw-r--r--. 1 python python 79 May 14 05:17test1-rw-r--r--. 1 root root 0 May 14 19:10 test2

实例

python中shutil是什么意思_python之shutil模块详解相关推荐

  1. python中if else语句用法_Python If-else语句用法详解

    本文概述 决策是几乎所有编程语言中最重要的方面.顾名思义, 决策制定使我们可以为特定决策运行特定代码块.在此, 将根据特定条件的有效性做出决定.条件检查是决策的基础. 在python中, 决策由以下语 ...

  2. python中lines是什么类型_python里的splitlines详解

    Python的split方法函数可以分割字符串成列表,默认是以空格作为分隔符sep来分割字符串. In [1]: s = "www jeapedu com" In [2]: pri ...

  3. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  4. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

  5. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  6. Python中常见的__init__.py是什么意思?详解Python import的方式和原理

    Python中常见的__init__.py是什么意思?详解Python import的方式和原理 1 什么是模块化编程? 2 __init__.py文件的作用 3 Python如何import第三方库 ...

  7. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  8. python什么意思k_对python中的*args与**kwgs的含义与作用详解

    对python中的*args与**kwgs的含义与作用详解 在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数, ...

  9. args在python中什么意思_对python中的*args与**kwgs的含义与作用详解

    在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kw是关键字参数 例如下面的代码 def fo ...

  10. python中sys模块是什么意思_python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

最新文章

  1. 加速针对COVID-19的医疗器械开发
  2. 【仿去哪儿】滑动隐藏导航栏
  3. wagtail python cms 测试部署
  4. 安装nexus时遇到的一个问题
  5. 前端笔记之NodeJS(四)MongoDB数据库Mongoose自制接口MVC架构思想|实战
  6. JSON.parse()和JSON.stringify()的区别
  7. Sunisoft.IrisSkin.SkinEngine 设置winform皮肤
  8. leetcode —— 589. N叉树的前序遍历 (使用到遍历多叉树的方法)
  9. flutter 动画展开菜单_Flutter ExpansionPanel 超级实用展开控件
  10. react-native 异常处理 Execution failed for task ':app:mergeDebugResources'.
  11. JavaScript第6章上机练习2(使用jQuery美化英雄联盟简介页)上机练习3(制作非缘勿扰页面特效)
  12. Java项目本地部署宝塔搭建实战-医院HIS系统源码
  13. 新知实验室--腾讯云TRTC体验
  14. 如何做二维码批量又快速
  15. MySQL 查询本月各周
  16. 打开php文件url格式,url格式是什么
  17. IOTE 2019物联网嘉年华在深圆满落幕
  18. HBUOJ--走台阶
  19. 计算机科学与技术专业发展问题,解析计算机科学与技术专业发展存在的问题.doc...
  20. Java实现混音 音频合成_ffmpeg混音(将多个声音合成一个)命令

热门文章

  1. Error: could not open `C:\Java\jre7\lib\amd64\jvm.cfg';JAVA_HOME环境变量失效的解决办法
  2. MEXGroup:外汇课堂丨头寸交易
  3. 从底层结构开始学习FPGA(8)----Block RAM(BRAM,块RAM)
  4. 简洁的JS图片滚动代码
  5. 午餐不知道吃什么?用 Python 爬美团App评论选餐!
  6. WikiText数据集_自然语言处理
  7. sql的不包含与包含
  8. 杨校老师课堂之Maven下载与配置阿里云镜像
  9. 音乐节拍识别 计算机,科学网—音乐节拍跟踪或音乐节拍检测软件,LilyBeats alpha - 石自强的博文...
  10. C1-见习工程师(计算机通识)