標籤:
import shutil,glob,os
#作用:處理一些檔案操作,如複製,設定許可權
#複製檔案copyfile()將源內容複寫到目標,如果沒有許可權寫目標檔案則產生 ioerror
print ‘before:‘,glob.glob(‘*.txt‘)
shutil.copyfile(‘lorem.txt‘,r‘copy/lorem.txt‘)
print ‘after:‘,glob.glob(r‘copy/lorem.txt‘)
#由於這個函數會開啟輸入檔案進行讀取,而不論其類型,所以某些特殊檔案(如unix裝置節點),不能使用copyfile()複製為新特殊檔案.
#copyfile()實現使用了底層函數copyfileobj(),copyfile()參數是檔案名稱,但copyfileobj()參數是開啟檔案控制代碼.還可以有第三參數(可選):用於讀入塊的一個緩衝區長度
from StringIO import StringIO as io
import sys,time
class Verbose(io):
def read(self, n = -1):
next1=io.read(self,n)
print ‘read(%d)bytes‘%(n)
return next1
l="The codecs module provides stream and file " \
"interfaces for transcoding data in your program. It is most " \
"commonly used to work with Unicode text, but other encodings " \
"are also available for other purposes."
print ‘default:‘,
input1=Verbose(l)
ouput1=io()
shutil.copyfileobj(input1,ouput1)
print
print ‘all at once:‘
input1=Verbose(l)
ouput1=io()
shutil.copyfileobj(input1,ouput1,-1)
print
print ‘blocks of 256:‘
input1=Verbose(l)
ouput1=io()
shutil.copyfileobj(input1,ouput1,256)
print
#預設行為是使用大資料讀取,使用-1會一次讀取全部,或者使用其他正數可以設定特定塊大小
#類似於unix命令列工具(cp,copy()函數)會使用同樣的方式解釋輸出名,如果指定目標指示一個目錄而不是一個檔案,會使用源檔案基名在該目錄中建立一個新檔案.
os.mkdir(r‘copy/abc‘)
print ‘beform:‘,os.listdir(r‘copy/abc‘)
shutil.copy(r‘lorem.txt‘,r‘copy/abc‘)
print ‘after:‘,os.listdir(r‘copy/abc‘)
#copy2()工作類似於copy(),不過複製到新檔案的中繼資料中會包含訪問和修改資料
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 ‘\t accessed:‘,time.ctime(stat_info.st_atime)
print ‘\tmodified:‘,time.ctime(stat_info.st_mtime)
os.mkdir(r‘copy/abcde‘)
print ‘source:‘
show_file_info(‘lorem.txt‘)
shutil.copy2(‘lorem.txt‘,r‘copy/abcde‘)
print ‘dest:‘
show_file_info(‘copy/abcde/lorem.txt‘)
#這個新檔案所有特性都與原檔案完全相同
#複製檔案中繼資料
#預設地,在unix下建立一個新檔案時,它會根據目前使用者的umask接受許可權,要把許可權從一個檔案複製到另一個檔案,使用copymode()
from commands import *
with open(r‘lorem.txt‘,‘wt‘)as f:
f.write(‘content‘)
os.chmod(r‘lorem.txt‘,0444)
print ‘before:‘
print getstatus(r‘lorem.txt‘)
shutil.copymode(r‘lorem.txt‘,r‘copy/lorem.doc‘)
print ‘after:‘
print getstatus(r‘copy/lorem.doc‘)
#要複製檔案的其他中繼資料,可以使用copystat()
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 ‘\t accessed:‘,time.ctime(stat_info.st_atime)
print ‘\tmodified:‘,time.ctime(stat_info.st_mtime)
with open(r‘lorem.txt‘,‘wt‘)as f:
f.write(‘content‘)
os.chmod(r‘lorem.txt‘,0444)
print ‘before:‘
print getstatus(r‘lorem.txt‘)
shutil.copystat(r‘lorem.txt‘,r‘copy/lorem.doc‘)
print ‘after:‘
#使用copystat()只會複製與檔案關聯的許可權和日期
#處理分類樹幹
"""
shutil包含了3個函數用來處理分類樹,要把從一個目錄從一個位置複製到另一個位置,可以使用copytree(),這會遞迴遍曆來源目錄樹,將檔案複製到目標,目標目錄不能已存在.
注意:copytree()文檔指出,應當把它看作一個樣本實現,而不是一個工具,可以考慮將當前這個實現作為起點,
在真正使用之前,要讓它更健壯,或者可以增加一些特性(如進度條)!
"""
print ‘befort:‘
print getoutput(r‘copy‘)
shutil.copytree(r‘copy‘,r‘copy/abcde‘)
print ‘after:‘
print getoutput(r‘copy‘)
#symlinks參數控制著符號作為連結複製還是作為檔案複製,預設將內容複寫到新檔案,如果這個選項為true,就會在目標樹中建立新的符號連結
#要刪除一個目錄及其中內容,可以使用rmtree()
print ‘befort:‘
print getoutput(r‘copy‘)
shutil.rmtree(r‘copy‘,r‘copy/abcde‘)
print ‘after:‘
print getoutput(r‘copy‘)
#預設地,錯誤會作為異常產生,不過如果第二參數為true,就可以忽略這些異常,可以在第三參數中提供一個特殊錯誤處理函數
#要把一個檔案或者目錄從一個位置移動到另一個位置可以使用move.
with open(‘aa.txt‘,‘wt‘)as f:
f.write(‘aa‘)
print ‘beform:‘,glob.glob(‘cc‘)
shutil.move(‘aa.txt‘,‘aa.bim‘)
print ‘atfer:‘,glob.glob(‘cc‘)
#其語義與unix命令mv類似,如果源和目標都在同一個檔案系統中,則會重新命名檔案,否則源檔案會複製到目標檔案,然後將源檔案刪除!
#shutil官方地址:https://docs.python.org/2/library/shutil.html
python標準庫之shutil檔案