python模塊之shutil高級文件操做

簡介

shutil模塊提供了大量的文件的高級操做。特別針對文件拷貝和刪除,主要功能爲目錄和文件操做以及壓縮操做。對單個文件的操做也可參見os模塊。python

注意即使是更高級別的文件複製函數(shutil.copy(),shutil.copy2())也不能複製全部文件的元數據。這意味着在POSIX平臺上,文件的全部者和組以及訪問控制列表都將丟失。在Mac OS中資源fork和其餘元數據沒法使用。這意味着資源將丟失,文件類型和建立者代碼將不正確。在Windows上,文件全部者,ACL和備用數據流不會被複制。ide

  • 功能:高級文件操做。
  • 類型:標準模塊
  • 相關模塊:
    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.*')

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]]):遞歸的去刪除文件

'''
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

    • base_name: 壓縮包的文件名,也能夠是壓縮包的路徑。只是文件名時,則保存至當前目錄,不然保存至指定路徑,
      如:www                        =>保存至當前路徑
      如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
    • format: 壓縮包種類,「zip」, 「tar」, 「bztar」,「gztar」
    • root_dir: 要壓縮的文件夾路徑(默認當前目錄)
    • owner: 用戶,默認當前用戶
    • group: 組,默認當前組
    • logger: 用於記錄日誌,一般是logging.Logger對象
# 將 /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*'))#一般的拷貝都把軟鏈接拷貝成硬連接,即對待軟鏈接來講,建立新的文件
相關文章
相關標籤/搜索