shutil模块提供了大量的文件的高级操做。特别针对文件拷贝和删除,主要功能为目录和文件操做以及压缩操做。对单个文件的操做也可参见os模块。python
注意即使是更高级别的文件复制函数(shutil.copy(),shutil.copy2())也不能复制全部文件的元数据。这意味着在POSIX平台上,文件的全部者和组以及访问控制列表都将丢失。在Mac OS中资源fork和其余元数据没法使用。这意味着资源将丢失,文件类型和建立者代码将不正确。在Windows上,文件全部者,ACL和备用数据流不会被复制。ide
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.*')
copyfile()调用了底函数层copyfileobj()。
shutil.copyfileobj(fsrc, fdst[, length]):复制文件内容(不包含元数据)从类文件对象src到类文件对dst。可选参数length指定缓冲区的大小,负数表示一次性读入。默认会把数据切分红小块拷贝,以避免占用太多内存。注意:拷贝是从fsrc的当前文件开始。spa
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)
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'))
shutil.copy2(src, dst):相似shutil.copy,元数据也复制,实际上先调用shutil.copy,而后使用copystat。这相似于Unix命令cp -p。code
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')
shutil.ignore_patterns(*patterns) 为copytree的辅助函数,提供glob功能,示例:orm
from shutil import copytree, ignore_patterns copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
当由UNIX下建立文件默认基于umask设置权限,copymode()能够复制权限。xml
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')
要想拷贝文件时间戳,须要copystat。blog
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')
''' shutil.rmtree(path[, ignore_errors[, onerror]]):递归的去删除文件 ''' import shutil shutil.rmtree('folder1') # import os,sys # shutil.rmtree(os.path.dirname(__file__)+"/c") # 删除 c目录 相似 rm -fr 不存在目录则报错
shutil.copytree(src, dst, symlinks=False, ignore=None):递归的去拷贝文件夹
''' 八、shutil.copytree(src, dst, symlinks=False, ignore=None):递归的去拷贝文件夹 ''' import shutil shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
import shutil shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))#一般的拷贝都把软链接拷贝成硬连接,即对待软链接来讲,建立新的文件
shutil.move(src, dst):递归的去移动文件,它相似mv命令,其实就是重命名。
''' 十、shutil.move(src, dst):递归的去移动文件,它相似mv命令,其实就是重命名。 ''' import shutil shutil.move('folder1', 'folder3') # shutil.move("c","b1") # 剪切c目录到b目录下 ,src即c目录不存在则报错 ,dst即b目录不存在就是重命名
shutil.make_archive(base_name, format,...)
a.建立压缩包并返回文件路径,例如:zip、tar
b.建立压缩包并返回文件路径,例如:zip、tar
# 将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录 import shutil ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test') # 将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录 import shutil ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test') # import os,sys # shutil.make_archive("my_bak","gztar",root_dir=os.path.dirname(__file__)+"/b1") # shutil.make_archive(os.path.dirname(__file__)+"/a/my_bak","gztar",root_dir=os.path.dirname(__file__)+"/b1")
c.shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
zipfile模块处理
import zipfile # 压缩 # z = zipfile.ZipFile('laxi.zip', 'w') # z.write('log.log') # z.write('first.xml') # z.close() # 添加一个文件 # z = zipfile.ZipFile('laxi.zip', 'a') # z.write('first1.xml') # z.write('a/a') # 将a目和其下面的a文件一同录压缩到里面 若是存在会保存,可是仍然压缩进入 # z.write('b/c') # 将b目录和其下面的c文件一同压缩到里面 # z.write('b/b') # 将b目录和其下面的c文件一同压缩到里面 # z.close() # 解压 # z = zipfile.ZipFile('laxi.zip', 'r') # z.extractall("log.log") # 解药全部文件到log.log目录 # z.extract("log.log") # 解压单个文件log.log到当前目录 文件若是存在也无报错 # z.extract("first.xml") # 解压单个文件log.log到当前目录 文件若是存在也无报错 # z.close()
tarfile模块处理
import tarfile,os # 压缩 # tar = tarfile.open("your.tar",'w') # 已存在不报错 # tar.add(os.path.dirname(__file__),arcname="nonosd") #将前面的目录从新更名为nonosd目录名 归档到your.tar中 # tar.add("first.xml",arcname="first.xml") #将前面的目录从新更名为nonosd目录名 归档到your.tar中 # tar.close() # tar = zipfile.ZipFile('laxi.zip', 'a') # tar.write('first1.xml') # tar.write('a/a') # 将a目和其下面的a文件一同录压缩到里面 若是存在会保存,可是仍然压缩进入 # tar.write('b/c') # 将b目录和其下面的c文件一同压缩到里面 # tar.write('b/b') # 将b目录和其下面的c文件一同压缩到里面 # tar.close() # 压缩 # tar = tarfile.open('your.tar','r') # # print(tar.getmembers()) # print(tar.getnames()) #查看全部的文件名 # tar.extract('first.xml') #解压单个文件 # tar.extractall(path="a/") # 解压全部到 path # tar.close()
一、shutil.copyfileobj(fsrc, fdst[, length]):将文件内容拷贝到另外一个文件中
1 ''' 2 一、shutil.copyfileobj(fsrc, fdst[, length]):将文件内容拷贝到另外一个文件中 3 ''' 4 import shutil 5 shutil.copyfileobj(open('old.xml', 'r'), open('new.xml', 'w'))
二、shutil.copyfile(src, dst):拷贝文件
1 ''' 2 二、shutil.copyfile(src, dst):拷贝文件 3 ''' 4 import shutil 5 shutil.copyfile('f1.log', 'f2.log')
三、shutil.copymode(src, dst):仅拷贝权限。内容、组、用户均不变
1 ''' 2 三、shutil.copymode(src, dst):仅拷贝权限。内容、组、用户均不变 3 ''' 4 import shutil 5 shutil.copymode('f1.log', 'f2.log')
四、shutil.copystat(src, dst):拷贝状态的信息,包括:mode bits, atime, mtime, flags
1 ''' 2 四、shutil.copystat(src, dst):拷贝状态的信息,包括:mode bits, atime, mtime, flags 3 ''' 4 import shutil 5 shutil.copystat('f1.log', 'f2.log')
五、shutil.copy(src, dst):拷贝文件和权限
1 ''' 2 五、shutil.copy(src, dst):拷贝文件和权限 3 ''' 4 import shutil 5 shutil.copy('f1.log', 'f2.log')
六、shutil.copy2(src, dst):拷贝文件和状态信息
1 ''' 2 六、shutil.copy2(src, dst):拷贝文件和状态信息 3 ''' 4 import shutil 5 shutil.copy2('f1.log', 'f2.log')
七、shutil.ignore_patterns(*patterns)
八、shutil.copytree(src, dst, symlinks=False, ignore=None):递归的去拷贝文件夹
1 ''' 2 八、shutil.copytree(src, dst, symlinks=False, ignore=None):递归的去拷贝文件夹 3 ''' 4 import shutil 5 shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
1 import shutil 2 shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))#一般的拷贝都把软链接拷贝成硬连接,即对待软链接来讲,建立新的文件