python- shutil 高级文件操作

简介

shutil模块提供了大量的文件的高级操作。特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作。对单个文件的操作也可参见os模块。

注意即便是更高级别的文件复制函数(shutil.copy(),shutil.copy2())也不能复制所有文件的元数据。这意味着在POSIX平台上,文件的所有者和组以及访问控制列表都将丢失。在Mac OS中资源fork和其他元数据无法使用。这意味着资源将丢失,文件类型和创建者代码将不正确。在Windows上,文件所有者,ACL和备用数据流不会被复制。

  • 功能:高级文件操作。
  • 类型:标准模块
  • 相关模块:
    1. os 标准模块。
    2. zipfile 标准模块。
    3. tarfile 标准模块。

拷贝文件

shutil.copyfile(src, dst):复制文件内容(不包含元数据)从src到dst。 DST必须是完整的目标文件名;拷贝目录参见shutil.copy()。如果src和dst是同一文件,就会引发错误shutil.Error。dst必须是可写的,否则将引发异常IOError。如果dst已经存在,它会被替换。特殊文件,例如字符或块设备和管道不能使用此功能,因为copyfile会打开并阅读文件。 src和dst的是字符串形式的路径名。

from shutil import *
from glob import glob

print ‘BEFORE:‘, glob(‘shutil_copyfile.*‘)
copyfile(‘shutil_copyfile.py‘, ‘shutil_copyfile.py.copy‘)
print ‘AFTER:‘, glob(‘shutil_copyfile.*‘)

执行结果:

# python shutil_copyfile.py
BEFORE: [‘shutil_copyfile.py‘]
AFTER: [‘shutil_copyfile.py‘, ‘shutil_copyfile.py.copy‘]
# python shutil_copyfile.py
BEFORE: [‘shutil_copyfile.py‘, ‘shutil_copyfile.py.copy‘]

copyfile()调用了底函数层copyfileobj()。
shutil.copyfileobj(fsrc, fdst[, length]):复制文件内容(不包含元数据)从类文件对象src到类文件对dst。可选参数length指定缓冲区的大小,负数表示一次性读入。默认会把数据切分成小块拷贝,以免占用太多内存。注意:拷贝是从fsrc的当前文件开始。

from shutil import *
import os
from StringIO import StringIO
import sys

class VerboseStringIO(StringIO):
    def read(self, n=-1):
        next = StringIO.read(self, n)
        print ‘read(%d) bytes‘ % n
        return next

lorem_ipsum = ‘‘‘Lorem ipsum dolor sit amet, consectetuer adipiscing
elit.  Vestibulum aliquam mollis dolor. Donec vulputate nunc ut diam.
Ut rutrum mi vel sem. Vestibulum ante ipsum.‘‘‘

print ‘Default:‘
input = VerboseStringIO(lorem_ipsum)
output = StringIO()
copyfileobj(input, output)

print

print ‘All at once:‘
input = VerboseStringIO(lorem_ipsum)
output = StringIO()
copyfileobj(input, output, -1)

print

print ‘Blocks of 256:‘
input = VerboseStringIO(lorem_ipsum)
output = StringIO()
copyfileobj(input, output, 256)

执行结果:

# python shutil_copyfileobj.py
Default:
read(16384) bytes
read(16384) bytes

All at once:
read(-1) bytes
read(-1) bytes

Blocks of 256:
read(256) bytes
read(256) bytes

shutil.copy(src, dst):复制文件src到文件或目录dst。如果dst是目录,使用src相同的文件名创建(或覆盖),权限位也会复制。src和dst的是字符串形式的路径名。

from shutil import *
import os

os.mkdir(‘example‘)
print ‘BEFORE:‘, os.listdir(‘example‘)
copy(‘shutil_copy.py‘, ‘example‘)
print ‘AFTER:‘, os.listdir(‘example‘)

执行结果:

# python shutil_copy.py
BEFORE: []
AFTER: [‘shutil_copy.py‘

shutil.copy2(src, dst):类似shutil.copy,元数据也复制,实际上先调用shutil.copy,然后使用copystat。这类似于Unix命令cp -p。

from shutil import *
import os
import time

def show_file_info(filename):
    stat_info = os.stat(filename)
    print ‘\tMode    :‘, stat_info.st_mode
    print ‘\tCreated :‘, time.ctime(stat_info.st_ctime)
    print ‘\tAccessed:‘, time.ctime(stat_info.st_atime)
    print ‘\tModified:‘, time.ctime(stat_info.st_mtime)

os.mkdir(‘example‘)
print ‘SOURCE:‘
show_file_info(‘shutil_copy2.py‘)
copy2(‘shutil_copy2.py‘, ‘example‘)
print ‘DEST:‘
show_file_info(‘example/shutil_copy2.py‘)

执行结果:

# python shutil_copy2.py
SOURCE:
        Mode    : 33279
        Created : Fri Dec  6 10:45:52 2013
        Accessed: Fri Dec  6 11:49:40 2013
        Modified: Mon Feb 21 01:37:46 2011
DEST:
        Mode    : 33279
        Created : Fri Dec  6 11:51:58 2013
        Accessed: Fri Dec  6 11:49:40 2013
        Modified: Mon Feb 21 01:37:46 2011

shutil.ignore_patterns(*patterns) 为copytree的辅助函数,提供glob功能,示例:

from shutil import copytree, ignore_patterns

copytree(source, destination, ignore=ignore_patterns(‘*.pyc‘, ‘tmp*‘))

拷贝文件元数据

当由UNIX下创建文件默认基于umask设置权限,copymode()可以复制权限。

shutil.copymode(src, dst):从SRC复制权限位到DST。该文件的内容,所有者和组不受影响。src和dst的是字符串形式的路径名。

from shutil import *
from commands import *
import os

with open(‘file_to_change.txt‘, ‘wt‘) as f:
    f.write(‘content‘)
os.chmod(‘file_to_change.txt‘, 0444)

print ‘BEFORE:‘
print getstatus(‘file_to_change.txt‘)
copymode(‘shutil_copymode.py‘, ‘file_to_change.txt‘)
print ‘AFTER :‘
print getstatus(‘file_to_change.txt‘)

执行结果:

# ./shutil_copymode.py
BEFORE:
-r--r--r-- 1 root root 7 Dec  7 17:35 file_to_change.txt
AFTER :
-rwxrwxrwx 1 root root 7 Dec  7 17:35 file_to_change.txt

要想拷贝文件时间戳,需要copystat。

shutil.copystat(src, dst): 从src复制权限位,最后访问时间,最后修改时间,flag到dst。该文件的内容,所有者和组不受影响。 src和dst的是给定的字符串路径名。

from shutil import *
import os
import time

def show_file_info(filename):
    stat_info = os.stat(filename)
    print ‘\tMode    :‘, stat_info.st_mode
    print ‘\tCreated :‘, time.ctime(stat_info.st_ctime)
    print ‘\tAccessed:‘, time.ctime(stat_info.st_atime)
    print ‘\tModified:‘, time.ctime(stat_info.st_mtime)

with open(‘file_to_change.txt‘, ‘wt‘) as f:
    f.write(‘content‘)
os.chmod(‘file_to_change.txt‘, 0444)

print ‘BEFORE:‘
show_file_info(‘file_to_change.txt‘)
copystat(‘shutil_copystat.py‘, ‘file_to_change.txt‘)
print ‘AFTER:‘
show_file_info(‘file_to_change.txt‘)

执行结果:

# python shutil_copystat.py
BEFORE:
        Mode    : 33060
        Created : Mon Dec  9 10:07:26 2013
        Accessed: Sat Dec  7 17:35:08 2013
        Modified: Mon Dec  9 10:07:26 2013
AFTER:
        Mode    : 33279
        Created : Mon Dec  9 10:07:26 2013
        Accessed: Mon Dec  9 10:06:14 2013
        Modified: Mon Feb 21 01:37:46 2011

压缩解压

2.7以后的版本提供了压缩和解压功能。

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]):创建归档文件(如ZIP或TAR),返回其名字。base_name文件名。format压缩格式,“zip”, “tar”, “bztar” or “gztar”。root_dir压缩的根目录。base_dir开始压缩的目录。root_dir 和 base_dir默认都是当前目录。所有者和组默认为当前用户和组;logger为logging.Logger的实例。

shutil.get_archive_formats():返回支持的格式列表。默认支持:

  • gztar:gzip压缩的tar文件
  • bztar:bzip2格式的tar文件
  • tar:未压缩的tar文件
  • zip:ZIP文件
In [3]: shutil.get_archive_formats()
Out[3]:
[(‘bztar‘, "bzip2‘ed tar-file"),
 (‘gztar‘, "gzip‘ed tar-file"),
 (‘tar‘, ‘uncompressed tar file‘),
 (‘zip‘, ‘ZIP file‘)]

通过使用register_archive_format()可以增加新格式。

shutil.register_archive_format(name, function[, extra_args[, description]]):注册一个文件格式。不常用。

shutil.unregister_archive_format(name):移除文件格式,不常用。

压缩实例:

from shutil import make_archive
import os
archive_name = os.path.expanduser(os.path.join(‘~‘, ‘myarchive‘))
root_dir = os.path.expanduser(os.path.join(‘~‘, ‘.ssh‘))
make_archive(archive_name, ‘gztar‘, root_dir)

上面代码会在当前用户目录生成压缩了.ssh目录的文件。

# tar tzvf myarchive.tar.gz
dr-x------ root/root         0 2013-10-22 18:52 ./
-rw------- root/root      1675 2013-06-06 20:01 ./id_rsa
-rw-r--r-- root/root       392 2013-06-06 20:01 ./id_rsa.pub
-r-------- root/root      1185 2013-08-06 09:41 ./authorized_k
时间: 2024-10-21 15:10:57

python- shutil 高级文件操作的相关文章

【Python】 高级文件操作 shutil

shutil 很多时候,我想要对文件进行重命名,删除,创建等操作的时候的想法就是用subprocess开一个子进程来处理,但是实际上shutil可以更加方便地提供os的文件操作接口,从而可以一条语句搞定.但是需要注意的是,这个模块并不能对命名管道,块设备等特殊的文件类型做操作. copy(src,dst) 将文件src复制到目录或文件dst,保留文件权限.src和dst都是指明路径的字符串 copy2(src,dst) 和copy类似,但是同时复制了最后访问的时间和修改时间 copyfile(s

第3章 文件I/O(7)_高级文件操作:存储映射

8. 高级文件操作:存储映射 (1)概念: 存储映射是一个磁盘文件与存储空间的一个缓存相映射,对缓存数据的读写就相应的完成了文件的读写. (2)mmap和munmap函数 头文件 #include<sys/types.h> #include<sys/mman.h> 函数 void* mmap(void* addr, size_t length, int prot, int flags,                       int fd, off_t offset); int

Python学习之--文件操作

Python中对文件操作可以用内置的open()函数 读文件 f=open('/home/test/test.txt','r') # 读模式打开文件 f.read() # 读取文件内容 除了正常的读取文件内容,一个常用的操作是判断文件内容是否为空,如下: if len(f.read())==0: # 如果文件内容为空 xxxx 判断一个文件或者路径是否存在,如下(这里需要在代码中导入os module: import os): file='/home/test/test.txt' dir='/h

python解析xml文件操作的例子

python解析xml文件操作实例,操作XML文件的常见技巧. xml文件内容: <?xml version="1.0" ?> <!--Simple xml document__chapter 8--> <book> <title> sample xml thing </title> <author> <name> <first> ma </first> <last>

【Python】解析Python中的文件操作

目录结构: contents structure [-] 简介 Python中的文件类型 内置函数的文件操作 open()函数 Mode 创建文本文件 读取文本文件 循环文件对象 关闭文件 With语句 os模块 fileinput模块 1.简介 在Python中无需引入额外的模块来进行文件操作,Python拥有内置的文件操作函数(除了内置文件操作函数,Python语言也提供了额外的文件操作模块,它们具有更加强大的功能). os模块提供了在操作系统上可移植的文件操作方法.如果只是想要读取和写入数

Python基础:Python函数、文件操作、递归

函数参数 函数参数包括位置参数,关键字参数,动态参数(*args, **args)三种. 传参的过程是形式参数的赋值. *args传入的参数是元组形式,**args传入的参数是字典形式. 示例代码如下:(这部分直接看代码实例会更清楚静态参数与动态参数如何混用) 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # def story(**kwargs): 4 # return 'Once upon a time,there was a ' 5

python 输入 和文件操作

1.python 输入 Python3提供了一个input(),可以让用户输入字符串,并存放到一个变量里.如下所示,用户从键盘输入 1 ,以回车结束,输入的 "1"以字符串的形式存在了 a 变量中. >>> a=input("Please input") Please input1 >>> a '1' >>> 2.python 文件操作 一.文件操作方法 1.os.mknod("test.txt&quo

PYTHON学习之文件操作;

文件内容替换for line in flielinput.input("filepath",inplace=1):line = line.repace("oldtext","newtext")print line, python中对文件.文件夹(文件操作函数)的操作需要涉及到OS模块和shutil模块.1.得到当前工作目录,即当前PYTHON脚本工作的目录路径:os.getcwd()2.返回指定目录下的所有文件和目录名:os.listdir()3

Python之路-文件操作(py)

文件操作的基本步骤: 1.打开文件:f=open('filename'),with open('filename') as f 2.操作文件:增,删,改,查 3.关闭文件:f.close 打开文件 python中打开文件的函数为open('filename',mode='r',encode='utf-8'),open函数默认返回文件的句柄,我们可以根据句柄来对文件进行增,删,改,查的操作.将句柄赋给我们定义的变量,假设我们定义变量为f,则f=open('filename',mode='r',en