版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Python文獻(xiàn)操作,看這篇就足夠Python中有幾種內(nèi)置模塊和措施來處理文獻(xiàn)。這些措施被分割到例如os,
os.path
,
shutil
和
pathlib
等等幾種模塊中。文章將列舉Python中對文獻(xiàn)最常用的操作和措施。在這篇文章中,你將學(xué)習(xí)怎樣:獲取文獻(xiàn)屬性創(chuàng)立目錄文獻(xiàn)名模式匹配遍歷目錄樹創(chuàng)立臨時文獻(xiàn)和目錄刪除文獻(xiàn)和目錄復(fù)制、移動和重命名文獻(xiàn)和目錄創(chuàng)立和解壓ZIP和TAR檔案使用fileinput
模塊打開多種文獻(xiàn)Python中文獻(xiàn)數(shù)據(jù)的讀和寫使用Python對文獻(xiàn)進(jìn)行讀和寫是十分簡樸的。為此,你首先必須使用合適的模式打開文獻(xiàn)。這里有一種怎樣打開文本文獻(xiàn)并讀取其內(nèi)容的例子。withopen('data.txt','r')asf:data=f.read()print('context:{}'.format(data))open()
接受一種文獻(xiàn)名和一種模式作為它的參數(shù),r
表達(dá)以只讀模式打開文獻(xiàn)。想要往文獻(xiàn)中寫數(shù)據(jù)的話,則用w
作為參數(shù)。withopen('data.txt','w')asf:data='somedatatobewrittentothefile'f.write(data)在上述例子中,open()打開用于讀取或?qū)懭氲奈墨I(xiàn)并返回文獻(xiàn)句柄(本例子中的
f
),該句柄提供了可用于讀取或?qū)懭胛墨I(xiàn)數(shù)據(jù)的措施。閱讀
WorkingWithFileI/OinPython
獲取更多有關(guān)怎樣讀寫文獻(xiàn)的信息。獲取目錄列表假設(shè)你目前的工作目錄有一種叫
my_directory
的子目錄,該目錄包括如下內(nèi)容:.├──file1.py├──file2.csv├──file3.txt├──sub_dir│├──bar.py│└──foo.py├──sub_dir_b│└──file4.txt└──sub_dir_c├──config.py└──file5.txtPython內(nèi)置的
os
模塊有諸多有用的措施能被用來列出目錄內(nèi)容和過濾成果。為了獲取文獻(xiàn)系統(tǒng)中特定目錄的所有文獻(xiàn)和文獻(xiàn)夾列表,可以在遺留版本的Python中使用
os.listdir()
或在Python3.x中使用
os.scandir()
。假如你還想獲取文獻(xiàn)和目錄屬性(如文獻(xiàn)大小和修改日期),那么
os.scandir()
則是首選的措施。使用遺留版本的Python獲取目錄列表importosentries=os.listdir('my_directory')os.listdir()
返回一種Python列表,其中包括path參數(shù)所指目錄的文獻(xiàn)和子目錄的名稱。['file1.py','file2.csv','file3.txt','sub_dir','sub_dir_b','sub_dir_c']目錄列表目前看上去不輕易閱讀,對
os.listdir()
的調(diào)用成果使用循環(huán)打印有助于查看。forentryinentries:print(entry)"""file1.pyfile2.csvfile3.txtsub_dirsub_dir_bsub_dir_c"""使用現(xiàn)代版本的Python獲取目錄列表在現(xiàn)代Python版本中,可以使用
os.scandir()
和
pathlib.Path
來替代
os.listdir()
。os.scandir()
在Python3.5中被引用,其文檔為
PEP471
。os.scandir()
調(diào)用時返回一種迭代器而不是一種列表。importosentries=os.scandir('my_directory')print(entries)#<posix.ScandirIteratorat0x105b4d4b0>ScandirIterator指向了目前目錄中的所有條目。你可以遍歷迭代器的內(nèi)容,并打印文獻(xiàn)名。importoswithos.scandir('my_directory')asentries:forentryinentries:print()這里
os.scandir()
和with語句一起使用,由于它支持上下文管理協(xié)議。使用上下文管理器關(guān)閉迭代器并在迭代器耗盡后自動釋放獲取的資源。在
my_directory
打印文獻(xiàn)名的成果就和在
os.listdir()
例子中看到的同樣:file1.pyfile2.csvfile3.txtsub_dirsub_dir_bsub_dir_c另一種獲取目錄列表的措施是使用
pathlib
模塊:frompathlibimportPathentries=Path('my_directory')forentryinentries.iterdir():print()pathlib.Path()
返回的是
PosixPath
或
WindowsPath
對象,這取決于操作系統(tǒng)。pathlib.Path()
對象有一種
.iterdir()
的措施用于創(chuàng)立一種迭代器包括該目錄下所有文獻(xiàn)和目錄。由
.iterdir()
生成的每個條目都包括文獻(xiàn)或目錄的信息,例如其名稱和文獻(xiàn)屬性。pathlib
在Python3.4時被第一次引入,并且是對Python一種很好的加強(qiáng),它為文獻(xiàn)系統(tǒng)提供了面向?qū)ο蟮慕涌凇T谏厦娴睦又?,你調(diào)用
pathlib.Path()
并傳入了一種途徑參數(shù)。然后調(diào)用
.iterdir()
來獲取
my_directory
下的所有文獻(xiàn)和目錄列表。pathlib
提供了一組類,以簡樸并且面向?qū)ο蟮姆绞教峁┝送緩缴系拇蠖鄶?shù)常見的操作。使用
pathlib
比起使用
os
中的函數(shù)愈加有效。和
os
相比,使用
pathlib
的另一種好處是減少了操作文獻(xiàn)系統(tǒng)途徑所導(dǎo)入包或模塊的數(shù)量。想要理解更多信息,可以閱讀
Python3’spathlibModule:TamingtheFileSystem
。運行上述代碼會得到如下成果:file1.pyfile2.csvfile3.txtsub_dirsub_dir_bsub_dir_c使用
pathlib.Path()
或
os.scandir()
來替代
os.listdir()
是獲取目錄列表的首選措施,尤其是當(dāng)你需要獲取文獻(xiàn)類型和文獻(xiàn)屬性信息的時候。pathlib.Path()
提供了在
os
和
shutil中大部分處理文獻(xiàn)和途徑的功能,并且它的措施比這些模塊愈加有效。我們將討論怎樣迅速的獲取文獻(xiàn)屬性。|函數(shù)|描述||------------------------|--------------------------------------------------------||os.listdir()|以列表的方式返回目錄中所有的文獻(xiàn)和文獻(xiàn)夾||os.scandir()|返回一種迭代器包括目錄中所有的對象,對象包括文獻(xiàn)屬性信息||pathlib.Path().iterdir()|返回一種迭代器包括目錄中所有的對象,對象包括文獻(xiàn)屬性信息|這些函數(shù)返回目錄中所有內(nèi)容的列表,包括子目錄。這也許并總是你一直想要的成果,下一節(jié)將向你展示怎樣從目錄列表中過濾成果。列出目錄中的所有文獻(xiàn)這節(jié)將向你展示怎樣使用
os.listdir()
,os.scandir()
和
pathlib.Path()
打印出目錄中文獻(xiàn)的名稱。為了過濾目錄并僅列出
os.listdir()
生成的目錄列表的文獻(xiàn),要使用
os.path
:importosbasepath='my_directory'forentryinos.listdir(basepath):#使用os.path.isfile判斷該途徑與否是文獻(xiàn)類型ifos.path.isfile(os.path.join(base_path,entry)):print(entry)在這里調(diào)用
os.listdir()
返回指定途徑中所有內(nèi)容的列表,接著使用
os.path.isfile()
過濾列表讓其只顯示文獻(xiàn)類型而非目錄類型。代碼執(zhí)行成果如下:file1.pyfile2.csvfile3.txt一種更簡樸的方式來列出一種目錄中所有的文獻(xiàn)是使用
os.scandir()
或
pathlib.Path()
:importosbasepath='my_directory'withos.scandir(basepath)asentries:forentryinentries:ifentry.is_file():print()使用
os.scandir()
比起
os.listdir()
看上去更清晰和更輕易理解。對
ScandirIterator
的每一項調(diào)用
entry.isfile()
,假如返回
True
則表達(dá)這一項是一種文獻(xiàn)。上述代碼的輸出如下:file1.pyfile3.txtfile2.csv接著,展示怎樣使用
pathlib.Path()
列出一種目錄中的文獻(xiàn):frompathlibimportPathbasepath=Path('my_directory')forentryinbasepath.iterdir():ifentry.is_file():print()在
.iterdir()
產(chǎn)生的每一項調(diào)用
.is_file()
。產(chǎn)生的輸出成果和上面相似:file1.pyfile3.txtfile2.csv假如將for循環(huán)和if語句組合成單個生成器體現(xiàn)式,則上述的代碼可以愈加簡潔。有關(guān)生成器體現(xiàn)式,推薦一篇DanBader
的文章。修改后的版本如下:frompathlibimportPathbasepath=Path('my_directory')files_in_basepath=(entryforentryinbasepath.iterdir()ifentry.is_file())foriteminfiles_in_basepath:print()上述代碼的執(zhí)行成果和之前相似。本節(jié)展示使用
os.scandir()
和
pathlib.Path()
過濾文獻(xiàn)或目錄比使用
os.listdir()
和
os.path
更直觀,代碼看起來更簡潔。列出子目錄假如要列出子目錄而不是文獻(xiàn),請使用下面的措施。目前展示怎樣使用
os.listdir()
和
os.path()
:importosbasepath='my_directory'forentryinos.listdir(basepath):ifos.path.isdir(os.path.join(basepath,entry)):print(entry)當(dāng)你多次調(diào)用
os.path,join()
時,以這種方式操作文獻(xiàn)系統(tǒng)就會變得很粗笨。在我電腦上運行此代碼會產(chǎn)生如下輸出:sub_dirsub_dir_bsub_dir_c下面是怎樣使用
os.scandir()
:importosbasepath='my_directory'withos.scandir(basepath)asentries:forentryinentries:ifentry.is_dir():print()與文獻(xiàn)列表中的示例同樣,此處在
os.scandir()
返回的每一項上調(diào)用
.is_dir()
。假如這項是目錄,則
is_dir()
返回True,并打印出目錄的名稱。輸出成果和上面相似:sub_dir_csub_dir_bsub_dir下面是怎樣使用
pathlib.Path()
:frompathlibimportPathbasepath=Path('my_directory')forentryinbasepath.iterdir():ifentry.is_dir():print()在
.iterdir()
迭代器返回的每一項上調(diào)用
is_dir()
檢查是文獻(xiàn)還是目錄。假如該項是目錄,則打印其名稱,并且生成的輸出與上一示例中的輸出相似:sub_dir_csub_dir_bsub_dir獲取文獻(xiàn)屬性Python可以很輕松的獲取文獻(xiàn)大小和修改時間等文獻(xiàn)屬性??梢酝ㄟ^使用
os.stat()
,
os.scandir()
或
pathlib.Path
來獲取。os.scandir()
和
pathlib.Path()
能直接獲取到包括文獻(xiàn)屬性的目錄列表。這也許比使用
os.listdir()
列出文獻(xiàn)然后獲取每個文獻(xiàn)的文獻(xiàn)屬性信息愈加有效。下面的例子顯示了怎樣獲取
my_directory
中文獻(xiàn)的最終修改時間。以時間戳的方式輸出:importoswithos.scandir('my_directory')asentries:forentryinentries:info=entry.stat()print(info.st_mtime)""".3952665.1982062.9175904.1841028.765162.4702623"""os.scandir()
返回一種
ScandirIterator
對象。ScandirIterator
對象中的每一項有
.stat()
措施能獲取有關(guān)它指向文獻(xiàn)或目錄的信息。.stat()
提供了例如文獻(xiàn)大小和最終修改時間的信息。在上面的示例中,代碼打印了
st_time
屬性,該屬性是上次修改文獻(xiàn)內(nèi)容的時間。pathlib
模塊具有對應(yīng)的措施,用于獲取相似成果的文獻(xiàn)信息:frompathlibimportPathbasepath=Path('my_directory')forentryinbasepath.iterdir():info=entry.stat()print(info.st_mtime)""".3952665.1982062.9175904.1841028.765162.4702623"""在上面的例子中,循環(huán)
.iterdir()
返回的迭代器并通過對其中每一項調(diào)用
.stat()
來獲取文獻(xiàn)屬性。st_mtime
屬性是一種浮點類型的值,表達(dá)的是時間戳。為了讓
st_time
返回的值更輕易閱讀,你可以編寫一種輔助函數(shù)將其轉(zhuǎn)換為一種
datetime
對象:importdatetimefrompathlibimportPathdeftimestamp2datetime(timestamp,convert_to_local=True,utc=8,is_remove_ms=True)"""轉(zhuǎn)換UNIX時間戳為datetime對象:paramtimestamp:時間戳:paramconvert_to_local:與否轉(zhuǎn)為當(dāng)?shù)貢r間:paramutc:時區(qū)信息,中國為utc+8:paramis_remove_ms:與否清除毫秒:return:datetime對象"""ifis_remove_ms:timestamp=int(timestamp)dt=datetime.datetime.utcfromtimestamp(timestamp)ifconvert_to_local:dt=dt+datetime.timedelta(hours=utc)returndtdefconvert_date(timestamp,format='%Y-%m-%d%H:%M:%S'):dt=timestamp2datetime(timestamp)returndt.strftime(format)basepath=Path('my_directory')forentryinbasepath.iterdir():ifentry.is_file()info=entry.stat()print('{}上次修改時間為{}'.format(,timestamp2datetime(info.st_mtime)))首先得到
my_directory
中文獻(xiàn)的列表以及它們的屬性,然后調(diào)用
convert_date()
來轉(zhuǎn)換文獻(xiàn)最終修改時間讓其以一種人類可讀的方式顯示。convert_date()
使用
.strftime()
將datetime類型轉(zhuǎn)換為字符串。上述代碼的輸出成果:file3.txt上次修改時間為-01-2409:04:39file2.csv上次修改時間為-01-2409:04:39file1.py上次修改時間為-01-2409:04:39將日期和時間轉(zhuǎn)換為字符串的語法也許會讓你感到混亂。假如要理解更多的信息,請查詢有關(guān)的官方文檔
。另一種方式則是閱讀
。創(chuàng)立目錄你編寫的程序遲早需要創(chuàng)立目錄以便在其中存儲數(shù)據(jù)。
os
和
pathlib
包括了創(chuàng)立目錄的函數(shù)。我們將會考慮如下措施:|措施|描述||--------------------|--------------------------||os.mkdir()|創(chuàng)立單個子目錄||os.makedirs()|創(chuàng)立多種目錄,包括中間目錄||Pathlib.Path.mkdir()|創(chuàng)立單個或多種目錄|創(chuàng)立單個目錄要創(chuàng)立單個目錄,把目錄途徑作為參數(shù)傳給
os.mkdir()
:importosos.mkdir('example_directory')假如該目錄已經(jīng)存在,os.mkdir()
將拋出
FileExistsError
異常?;蛘?,你也可以使用
pathlib
來創(chuàng)立目錄:frompathlibimportPathp=Path('example_directory')p.mkdir()假如途徑已經(jīng)存在,mkdir()
會拋出
FileExistsError
異常:FileExistsError:[Errno17]Fileexists:'example_directory'為了防止像這樣的錯誤拋出,當(dāng)發(fā)生錯誤時捕捉錯誤并讓你的顧客懂得:frompathlibimportPathp=Path('example_directory')try:p.mkdir()exceptFileExistsErrorase:print(e)或者,你可以給
.mkdir()
傳入
exist_ok=True
參數(shù)來忽視
FileExistsError
異常:frompathlibimportPathp=Path('example_directory')p.mkdir(exist_ok=True)假如目錄已存在,則不會引起錯誤。創(chuàng)立多種目錄os.makedirs()
和
os.mkdir()
類似。兩者之間的區(qū)別在于,os.makedirs()
不僅可以創(chuàng)立單獨的目錄,還可以遞歸的創(chuàng)立目錄樹。換句話說,它可以創(chuàng)立任何須要的中間文獻(xiàn)夾,來保證存在完整的途徑。os.makedirs()
和在bash中運行
mkdir-p
類似。例如,要創(chuàng)立一組目錄像/10/05,你可以像下面那樣操作:importosos.makedirs('/10/05',mode=0o770)上述代碼創(chuàng)立了
/10/05
的目錄構(gòu)造并為所有者和組顧客提供讀、寫和執(zhí)行權(quán)限。默認(rèn)的模式為
0o777
,增長了其他顧客組的權(quán)限。有關(guān)文獻(xiàn)權(quán)限以及模式的應(yīng)用方式的更多詳細(xì)信息,請參照
文檔
。運行
tree
命令確認(rèn)我們應(yīng)用的權(quán)限:$tree-p-i..[drwxrwx---][drwxrwx---]10[drwxrwx---]05上述代碼打印出目前目錄的目錄樹。
tree
一般被用來以樹形構(gòu)造列出目錄的內(nèi)容。傳入
-p
和
-i
參數(shù)則會以垂直列表打印出目錄名稱以及其文獻(xiàn)權(quán)限信息。-p
用于輸出文獻(xiàn)權(quán)限,-i
則用于讓
tree
命令產(chǎn)生一種沒有縮進(jìn)線的垂直列表。正如你所看到的,所有的目錄都擁有770權(quán)限。另一種方式創(chuàng)立多種目錄是使用
pathlib.Path的
.mkdir()
:frompathlibimportPathp=Path('/10/05')p.mkdir(parents=True,exist_ok=True)通過給
Path.mkdir()
傳遞
parents=True
關(guān)鍵字參數(shù)使它創(chuàng)立
05
目錄和使其途徑有效的所有父級目錄。在默認(rèn)狀況下,os.makedirs()
和
pathlib.Path.mkdir()
會在目的目錄存在的時候拋出
OSError
。通過每次調(diào)用函數(shù)時傳遞
exist_ok=True
作為關(guān)鍵字參數(shù)則可以覆蓋此行為(從Python3.2開始)。運行上述代碼會得到像下面的構(gòu)造:└──└──10└──05我更喜歡在創(chuàng)立目錄時使用
pathlib
,由于我可以使用相似的函數(shù)措施來創(chuàng)立一種或多種目錄。文獻(xiàn)名模式匹配使用上述措施之一獲取目錄中的文獻(xiàn)列表后,你也許但愿搜索和特定的模式匹配的文獻(xiàn)。下面這些是你可以使用的措施和函數(shù):endswith()
和
startswith()
字符串措施fnmatch.fnmatch()glob.glob()pathlib.Path.glob()這些措施和函數(shù)是下面要討論的。本小節(jié)的示例將在名為
some_directory
的目錄下執(zhí)行,該目錄具有如下的構(gòu)造:.├──admin.py├──data_01_backup.txt├──data_01.txt├──data_02_backup.txt├──data_02.txt├──data_03_backup.txt├──data_03.txt├──sub_dir│├──file1.py│└──file2.py└──tests.py假如你正在使用Bashshell,你可以使用如下的命令創(chuàng)立上述目錄構(gòu)造:mkdirsome_directorycdsome_directorymkdirsub_dirtouchsub_dir/file1.pysub_dir/file2.pytouchdata_{01..03}.txtdata_{01..03}_backup.txtadmin.pytests.py這將會創(chuàng)立
some_directory
目錄并進(jìn)入它,接著創(chuàng)立
sub_dir
。下一行在
sub_dir
創(chuàng)立
file1.py
和
file2.py
,最終一行使用擴(kuò)展創(chuàng)立其他所有文獻(xiàn)。想要學(xué)習(xí)更多有關(guān)shell擴(kuò)展,請閱讀
這里
。使用字符串措施Python有幾種內(nèi)置
修改和操作字符串
的措施。當(dāng)在匹配文獻(xiàn)名時,其中的兩個措施
.startswith()
和
.endswith()
非常有用。要做到這點,首先要獲取一種目錄列表,然后遍歷。importosforf_nameinos.listdir('some_directory'):iff_name.endswith('.txt'):print(f_name)上述代碼找到
some_directory
中的所有文獻(xiàn),遍歷并使用
.endswith()
來打印所有擴(kuò)展名為
.txt
的文獻(xiàn)名。運行代碼在我的電腦上輸出如下:data_01.txtdata_01_backup.txtdata_02.txtdata_02_backup.txtdata_03.txtdata_03_backup.txt使用
fnmatch
進(jìn)行簡樸文獻(xiàn)名模式匹配字符串措施匹配的能力是有限的。fnmatch
有對于模式匹配有更先進(jìn)的函數(shù)和措施。我們將考慮使用
fnmatch.fnmatch()
,這是一種支持使用
*
和
?
等通配符的函數(shù)。例如,使用
fnmatch
查找目錄中所有
.txt
文獻(xiàn),你可以這樣做:importosimportfnmatchforf_nameinos.listdir('some_directory'):iffnmatch.fnmatch(f_name,'*.txt'):print(f_name)迭代
some_directory
中的文獻(xiàn)列表,并使用
.fnmatch()
對擴(kuò)展名為
.txt
的文獻(xiàn)執(zhí)行通配符搜索。更先進(jìn)的模式匹配假設(shè)你想要查找符合特定掉件的
.txt
文獻(xiàn)。例如,你也許指向找到包括單次
data
的
.txt文獻(xiàn),一組下劃線之間的數(shù)字,以及文獻(xiàn)名中包括單詞
backup
。就類似于
data_01_backup,
data_02_backup,或
data_03_backup
。你可以這樣使用
fnmatch.fnmatch()
:importosimportfnmatchforf_nameinos.listdir('some_directory'):iffnmatch.fnmatch(f_name,'data_*_backup.txt'):print(f_name)這里就僅僅打印出匹配
data_*_backup.txt
模式的文獻(xiàn)名稱。模式中的
*
將匹配任何字符,因此運行這段代碼則將查找文獻(xiàn)名以
data
開頭并以
backup.txt
的所有文本文獻(xiàn),就行下面的輸出所示:data_01_backup.txtdata_02_backup.txtdata_03_backup.txt使用
glob
進(jìn)行文獻(xiàn)名模式匹配另一種有用的模式匹配模塊是
glob
。.glob()
在
glob
模塊中的左右就像
fnmatch.fnmatch(),不過與
fnmach.fnmatch()
不一樣的是,它將以
.
開頭的文獻(xiàn)視為特殊文獻(xiàn)。UNIX和有關(guān)系統(tǒng)在文獻(xiàn)列表中使用通配符像
?
和
*
表達(dá)全匹配。例如,在UNIXshell中使用
mv*.pypython_files
移動所有
.py
擴(kuò)展名的文獻(xiàn)從目前目錄到
python_files
。這
*
是一種通配符表達(dá)任意數(shù)量的字符,*.py
是一種全模式。Windows操作系統(tǒng)中不提供此shell功能。但
glob
模塊在Python中添加了此功能,使得Windows程序可以使用這個特性。這里有一種使用
glob
模塊在目前目錄下查詢所有Python代碼文獻(xiàn):importglobprint(glob.glob('*.py'))glob.glob('*.py')
搜索目前目錄中具有
.py
擴(kuò)展名的文獻(xiàn),并且將它們以列表的形式返回。
glob
還支持shell樣式的通配符來進(jìn)行匹配:importglobfornameinglob.glob('*[0-9]*.txt'):print(name)這將找到所有文獻(xiàn)名中包括數(shù)字的文本文獻(xiàn)(.txt):data_01.txtdata_01_backup.txtdata_02.txtdata_02_backup.txtdata_03.txtdata_03_backup.txtglob
也很輕易在子目錄中遞歸的搜索文獻(xiàn):importglobfornameinglob.iglob('**/*.py',recursive=True):print(name)這里例子使用了
glob.iglob()
在目前目錄和子目錄中搜索所有的
.py
文獻(xiàn)。傳遞
recursive=True
作為
.iglob()
的參數(shù)使其搜索目前目錄和子目錄中的
.py
文獻(xiàn)。glob.glob()
和
glob.iglob()
不一樣之處在于,iglob()
返回一種迭代器而不是一種列表。運行上述代碼會得到如下成果:admin.pytests.pysub_dir/file1.pysub_dir/file2.pypathlib
也包括類似的措施來靈活的獲取文獻(xiàn)列表。下面的例子展示了你可以使用
.Path.glob()
列出以字母
p
開始的文獻(xiàn)類型的文獻(xiàn)列表。frompathlibimportPathp=Path('.')fornameinp.glob('*.p*'):print(name)調(diào)用
p.glob('*.p*')
會返回一種指向目前目錄中所有擴(kuò)展名以字母
p
開頭的文獻(xiàn)的生成器對象。Path.glob()
和上面討論過的
os.glob()
類似。正如你看到的,
pathlib
混合了許多
os
,
os.path
和
glob
模塊的最佳特性到一種模塊中,這使得使用起來很以便?;貞浺幌拢@是我們在本節(jié)中簡介的功能表:|函數(shù)|描述||----------------------------------|----------------------------------------------------------||startswith()|測試一種字符串與否以一種特定的模式開始,返回True或False||endswith()|測試一種字符串與否以一種特定的模式結(jié)束,返回True或False||fnmatch.fnmatch(filename,pattern)|測試文獻(xiàn)名與否匹配這個模式,返回True或False||glob.glob()|返回一種匹配該模式的文獻(xiàn)名列表||pathlib.Path.glob()|返回一種匹配該模式的生成器對象|遍歷目錄和處理文獻(xiàn)一種常見的編程任務(wù)是遍歷目錄樹并處理目錄樹中的文獻(xiàn)。讓我們來探討一下怎樣使用內(nèi)置的Python函數(shù)
os.walk()
來實現(xiàn)這一功能。os.walk()
用于通過從上到下或從下到上遍歷樹來生成目錄樹中的文獻(xiàn)名。處在本節(jié)的目的,我們想操作如下的目錄樹:├──folder_1│├──file1.py│├──file2.py│└──file3.py├──folder_2│├──file4.py│├──file5.py│└──file6.py├──test1.txt└──test2.txt如下是一種示例,演示怎樣使用
os.walk()
列出目錄樹中的所有文獻(xiàn)和目錄。os.walk()
默認(rèn)是從上到下遍歷目錄:pythonimportosfordirpath,dirname,filesinos.walk('.'):print(f'Founddirectory:{dirpath}')forfile_nameinfiles:print(file_name)os.walk()
在每個循環(huán)中返回三個值:目前文獻(xiàn)夾的名稱目前文獻(xiàn)夾中子文獻(xiàn)夾的列表目前文獻(xiàn)夾中文獻(xiàn)的列表在每次迭代中,會打印出它找到的子目錄和文獻(xiàn)的名稱:Founddirectory:.test1.txttest2.txtFounddirectory:./folder_1file1.pyfile3.pyfile2.pyFounddirectory:./folder_2file4.pyfile5.pyfile6.py要以自下而上的方式遍歷目錄樹,則將
topdown=False
關(guān)鍵字參數(shù)傳遞給
os.walk()
:fordirpath,dirnames,filesinos.walk('.',topdown=False):print(f'Founddirectory:{dirpath}')forfile_nameinfiles:print(file_name)傳遞
topdown=False
參數(shù)將使
os.walk()
首先打印出它在子目錄中找到的文獻(xiàn):Founddirectory:./folder_1file1.pyfile3.pyfile2.pyFounddirectory:./folder_2file4.pyfile5.pyfile6.pyFounddirectory:.test1.txttest2.txt如你看見的,程序在列出根目錄的內(nèi)容之前列出子目錄的內(nèi)容。這在在你想要遞歸刪除文獻(xiàn)和目錄的狀況下非常有用。你將在如下部分中學(xué)習(xí)怎樣執(zhí)行此操作。默認(rèn)狀況下,os.walk
不會訪問通過軟連接創(chuàng)立的目錄??梢酝ㄟ^使用
followlinks=True
參數(shù)來覆蓋默認(rèn)行為。創(chuàng)立臨時文獻(xiàn)和目錄Python提供了
tempfile
模塊來便捷的創(chuàng)立臨時文獻(xiàn)和目錄。tempfile
可以在你程序運行時打開并存儲臨時的數(shù)據(jù)在文獻(xiàn)或目錄中。
tempfile
會在你程序停止運行后刪除這些臨時文獻(xiàn)。目前,讓我們看看怎樣創(chuàng)立一種臨時文獻(xiàn):fromtempfileimportTemporaryFile#創(chuàng)立一種臨時文獻(xiàn)并為其寫入某些數(shù)據(jù)fp=TemporaryFile('w+t')fp.write('HelloWorld!')#回到開始,從文獻(xiàn)中讀取數(shù)據(jù)fp.seek(0)data=fp.read()print(data)#關(guān)閉文獻(xiàn),之后他將會被刪除fp.close()第一步是從
tempfile
模塊導(dǎo)入
TemporaryFile
。接下來,使用
TemporaryFile()
措施并傳入一種你想打開這個文獻(xiàn)的模式來創(chuàng)立一種類似于對象的文獻(xiàn)。這將創(chuàng)立并打開一種可用作臨時存儲區(qū)域的文獻(xiàn)。在上面的示例中,模式為
w+t,這使得
tempfile
在寫入模式下創(chuàng)立臨時文本文獻(xiàn)。沒有必要為臨時文獻(xiàn)提供文獻(xiàn)名,由于在腳本運行完畢后它將被銷毀。寫入文獻(xiàn)后,您可以從中讀取并在完畢處理后將其關(guān)閉。一旦文獻(xiàn)關(guān)閉后,將從文獻(xiàn)系統(tǒng)中刪除。假如需要命名使用
tempfile
生成的臨時文獻(xiàn),請使用
tempfile.NamedTemporaryFile()。使用
tempfile
創(chuàng)立的臨時文獻(xiàn)和目錄存儲在用于存儲臨時文獻(xiàn)的特殊系統(tǒng)目錄中。Python將在目錄列表搜索顧客可以在其中創(chuàng)立文獻(xiàn)的目錄。在Windows上,目錄按次序為
C:\TEMP,C:\TMP,\TEMP
和
\TMP。在所有其他平臺上,目錄按次序為
/tmp,/var/tmp
和
/usr/tmp
。假如上述目錄中都沒有,tempfile
將在目前目錄中存儲臨時文獻(xiàn)和目錄。.TemporaryFile()
也是一種上下文管理器,因此它可以與with語句一起使用。使用上下文管理器會在讀取文獻(xiàn)后自動關(guān)閉和刪除文獻(xiàn):withTemporaryFile('w+t')asfp:fp.write('Hellouniverse!')fp.seek(0)fp.read()#臨時文獻(xiàn)目前已經(jīng)被關(guān)閉和刪除這將創(chuàng)立一種臨時文獻(xiàn)并從中讀取數(shù)據(jù)。一旦讀取文獻(xiàn)的內(nèi)容,就會關(guān)閉臨時文獻(xiàn)并從文獻(xiàn)系統(tǒng)中刪除。tempfile
也可用于創(chuàng)立臨時目錄。讓我們看一下怎樣使用
tempfile.TemporaryDirectory()來做到這一點:importtempfileimportostmp=''withtempfile.TemporaryDirectory()astmpdir:print('Createdtemporarydirectory',tmpdir)tmp=tmpdirprint(os.path.exists(tmpdir))print(tmp)print(os.path.exists(tmp))調(diào)用
tempfile.TemporaryDirectory()
會在文獻(xiàn)系統(tǒng)中創(chuàng)立一種臨時目錄,并返回一種表達(dá)該目錄的對象。在上面的示例中,使用上下文管理器創(chuàng)立目錄,目錄的名稱存儲在
tmpdir
變量中。第三行打印出臨時目錄的名稱,os.path.exists(tmpdir)
來確認(rèn)目錄與否實際在文獻(xiàn)系統(tǒng)中創(chuàng)立。在上下文管理器退出上下文后,臨時目錄將被刪除,并且對
os.path.exists(tmpdir)的調(diào)用將返回False,這意味著該目錄已成功刪除。刪除文獻(xiàn)和目錄您可以使用
os,shutil
和
pathlib
模塊中的措施刪除單個文獻(xiàn),目錄和整個目錄樹。如下將簡介怎樣刪除你不再需要的文獻(xiàn)和目錄。Python中刪除文獻(xiàn)要刪除單個文獻(xiàn),請使用
pathlib.Path.unlink(),os.remove()
或
os.unlink()。os.remove()
和
os.unlink()
在語義上是相似的。要使用
os.remove()刪除文獻(xiàn),請執(zhí)行如下操作:importosdata_file='C:\\Users\\vuyisile\\Desktop\\Test\\data.txt'os.remove(data_file)使用
os.unlink()
刪除文獻(xiàn)與使用
os.remove()
的方式類似:importosdata_file='C:\\Users\\vuyisile\\Desktop\\Test\\data.txt'os.unlink(data_file)在文獻(xiàn)上調(diào)用
.unlink()
或
.remove()
會從文獻(xiàn)系統(tǒng)中刪除該文獻(xiàn)。假如傳遞給它們的途徑指向目錄而不是文獻(xiàn),這兩個函數(shù)將拋出
OSError
。為防止這種狀況,可以檢查你要刪除的內(nèi)容與否是文獻(xiàn),并在確認(rèn)是文獻(xiàn)時執(zhí)行刪除操作,或者可以使用異常處理來處理
OSError
:importosdata_file='home/data.txt'#假如類型是文獻(xiàn)則進(jìn)行刪除ifos.path.is_file(data_file):os.remove(data_file)else:print(f'Error:{data_file}notavalidfilename')os.path.is_file()
檢查
data_file
與否實際上是一種文獻(xiàn)。假如是,則通過調(diào)用
os.remove()
刪除它。假如
data_file
指向文獻(xiàn)夾,則會向控制臺輸出錯誤消息。如下示例闡明怎樣在刪除文獻(xiàn)時使用異常處理來處理錯誤:importosdata_file='home/data.txt'#使用異常處理try:os.remove(data_file)exceptOSErrorase:print(f'Error:{data_file}:{e.strerror}')上面的代碼嘗試在檢查其類型之前先刪除該文獻(xiàn)。假如
data_file
實際上不是文獻(xiàn),則拋出的
OSError
將在except子句中處理,并向控制臺輸出錯誤消息。打印出的錯誤消息使用
Pythonf-strings
格式化。最終,你還可以使用
pathlib.Path.unlink()
刪除文獻(xiàn):frompathlibimportPathdata_file=Path('home/data.txt')try:data_file.unlink()exceptIsADirectoryErrorase:print(f'Error:{data_file}:{e.strerror}')這將創(chuàng)立一種名為
data_file
的
Path
對象,該對象指向一種文獻(xiàn)。在
data_file
上調(diào)用.unlink()將刪除
home/data.txt
。假如
data_file
指向目錄,則引起
IsADirectoryError
。值得注意的是,上面的Python程序和運行它的顧客具有相似的權(quán)限。假如顧客沒有刪除文獻(xiàn)的權(quán)限,則會引起
PermissionError
。刪除目錄原則庫提供了一下函數(shù)來刪除目錄:os.rmdir()pathlib.Path.rmdir()shutil.rmtree()要刪除單個目錄或文獻(xiàn)夾可以使用
os.rmdir()
或
pathlib.Path.rmdir()
。這兩個函數(shù)只在你刪除空目錄的時候有效。假如目錄不為空,則會拋出
OSError
。下面演示怎樣刪除一種文獻(xiàn)夾:importostrash_dir='my_documents/bad_dir'try:os.rmdir(trash_dir)exceptOSErrorase:print(f'Error:{trash_dir}:{e.strerror}')目前,trash_dir
已經(jīng)通過
os.rmdir()
被刪除了。假如目錄不為空,則會在屏幕上打印錯誤信息:Traceback(mostrecentcalllast):File'<stdin>',line1,in<module>OSError:[Errno39]Directorynotempty:'my_documents/bad_dir'同樣,你也可使用
pathlib
來刪除目錄:frompathlibimportPathtrash_dir=Path('my_documents/bad_dir')try:trash_dir.rmdir()exceptOSErrorase:print(f'Error:{trash_dir}:{e.strerror}')這里創(chuàng)立了一種
Path
對象指向要被刪除的目錄。假如目錄為空,調(diào)用
Path
對象的
.rmdir()措施刪除它。刪除完整的目錄樹要刪除非空目錄和完整的目錄樹,Python提供了
shutil.rmtree()
:importshutiltrash_dir='my_documents/bad_dir'try:shutil.rmtree(trash_dir)exceptOSErrorase:print(f'Error:{trash_dir}:{e.strerror}')當(dāng)調(diào)用
shutil.rmtree()
時,trash_dir
中的所有內(nèi)容都將被刪除。在某些狀況下,你也許但愿以遞歸方式刪除空文獻(xiàn)夾。你可以使用上面討論的措施之一結(jié)合
os.walk()
來完畢此操作:importosfordirpath,dirnames,filesinos.walk('.',topdown=False):try:os.rmdir(dirpath)exceptOSErrorasex:pass這將遍歷目錄樹并嘗試刪除它找到的每個目錄。假如目錄不為空,則引起OSError并跳過該目錄。下表列出了本節(jié)中波及的功能:|函數(shù)|描述||---------------------|------------------------------------||os.remove()|刪除單個文獻(xiàn),不能刪除目錄||os.unlink()|和os.remove()同樣,職能刪除單個文獻(xiàn)||pathlib.Path.unlink()|刪除單個文獻(xiàn),不能刪除目錄||os.rmdir()|刪除一種空目錄||pathlib.Path.rmdir()|刪除一種空目錄||shutil.rmtree()|刪除完整的目錄樹,可用于刪除非空目錄|復(fù)制、移動和重命名文獻(xiàn)和目錄Python附帶了
shutil
模塊。
shutil
是shell實用程序的縮寫。它為文獻(xiàn)提供了許多高級操作,來支持文獻(xiàn)和目錄的復(fù)制,歸檔和刪除。在本節(jié)中,你將學(xué)習(xí)怎樣移動和復(fù)制文獻(xiàn)和目錄。復(fù)制文獻(xiàn)shutil
提供了某些復(fù)制文獻(xiàn)的函數(shù)。最常用的函數(shù)是
shutil.copy()
和
shutil.copy2()
。使用shutil.copy()
將文獻(xiàn)從一種位置復(fù)制到另一種位置,請執(zhí)行如下操作:importshutilsrc='path/to/file.txt'dst='path/to/dest_dir'shutil.copy(src,dst)shutil.copy()
與基于UNIX的系統(tǒng)中的
cp
命令相稱。
shutil.copy(src,dst)
會將文獻(xiàn)
src
復(fù)制到
dst
中指定的位置。假如
dst
是文獻(xiàn),則該文獻(xiàn)的內(nèi)容將替代為
src
的內(nèi)容。假如
dst
是目錄,則
src
將被復(fù)制到該目錄中。
shutil.copy()
僅復(fù)制文獻(xiàn)的內(nèi)容和文獻(xiàn)的權(quán)限。其他元數(shù)據(jù)(如文獻(xiàn)的創(chuàng)立和修改時間)不會保留。要在復(fù)制時保留所有文獻(xiàn)元數(shù)據(jù),請使用
shutil.copy2()
:importshutilsrc='path/to/file.txt'dst='path/to/dest_dir'shutil.copy2(src,dst)使用
.copy2()
保留有關(guān)文獻(xiàn)的詳細(xì)信息,例如上次訪問時間,權(quán)限位,上次修改時間和標(biāo)志。復(fù)制目錄雖然
shutil.copy()
只復(fù)制單個文獻(xiàn),但
shutil.copytree()
將復(fù)制整個目錄及其中包括的所有內(nèi)容。
shutil.copytree(src,dest)
接受兩個參數(shù):源目錄和將文獻(xiàn)和文獻(xiàn)夾復(fù)制到的目的目錄。如下是怎樣將一種文獻(xiàn)夾的內(nèi)容復(fù)制到其他位置的示例:importshutildst=shutil.copytree('data_1','data1_backup')print(dst)#data1_backup在此示例中,.copytree()
將
data_1
的內(nèi)容復(fù)制到新位置
data1_backup
并返回目的目錄。目的目錄不能是已存在的。它將被創(chuàng)立而不帶有其父目錄。
shutil.copytree()
是備份文獻(xiàn)的一種好措施。移動文獻(xiàn)和目錄要將文獻(xiàn)或目錄移動到其他位置,請使用
shutil.move(src,dst)
。src
是要移動的文獻(xiàn)或目錄,dst
是目的:importshutildst=shutil.move('dir_1/','backup/')print(dst)#'backup'假如
backup/
存在,則
shutil.move('dir_1/','backup/')
將
dir_1/
移動到
backup/
。假如
backup/
不存在,則
dir_1/
將重命名為
backup
。重命名文獻(xiàn)和目錄Python包括用于重命名文獻(xiàn)和目錄的
os.rename(src,dst):importosos.rename('first.zip','first_01.zip')上面的行將
first.zip
重命名為
first_01.zip
。假如目的途徑指向目錄,則會拋出
OSError。重命名文獻(xiàn)或目錄的另一種措施是使用
pathlib
模塊中的
rename():frompathlibimportPathdata_file=Path('data_01.txt')data_file.rename('data.txt')要使用
pathlib
重命名文獻(xiàn),首先要創(chuàng)立一種
pathlib.Path()
對象,該對象包括要替代的文獻(xiàn)的途徑。下一步是在途徑對象上調(diào)用
rename()
并傳入你要重命名的文獻(xiàn)或目錄的新名稱。歸檔歸檔是將多種文獻(xiàn)打包成一種文獻(xiàn)的便捷方式。兩種最常見的存檔類型是ZIP和TAR。你編寫的Python程序可以創(chuàng)立存檔文獻(xiàn),讀取存檔文獻(xiàn)和從存檔文獻(xiàn)中提取數(shù)據(jù)。你將在本節(jié)中學(xué)習(xí)怎樣讀取和寫入兩種壓縮格式。讀取ZIP文獻(xiàn)zipfile
模塊是一種底層模塊,是Python原則庫的一部分。
zipfile
具有可以輕松打開和提取ZIP文獻(xiàn)的函數(shù)。要讀取ZIP文獻(xiàn)的內(nèi)容,首先要做的是創(chuàng)立一種
ZipFile
對象。ZipFile
對象類似于使用
open()
創(chuàng)立的文獻(xiàn)對象。ZipFile
也是一種上下文管理器,因此支持with語句:importzipfilewithzipfile.ZipFile('data.zip','r')aszipobj:pass這里創(chuàng)立一種
ZipFile
對象,傳入ZIP文獻(xiàn)的名稱并以讀取模式下打開。打開ZIP文獻(xiàn)后,可以通過
zipfile
模塊提供的函數(shù)訪問有關(guān)存檔文獻(xiàn)的信息。上面示例中的
data.zip
存檔是從名為
data
的目錄創(chuàng)立的,該目錄包括總共5個文獻(xiàn)和1個子目錄:.|├──sub_dir/|├──bar.py|└──foo.py|├──file1.py├──file2.py└──file3.py要獲取存檔文獻(xiàn)中的文獻(xiàn)列表,請在
ZipFile
對象上調(diào)用
namelist()
:importzipfilewithzipfile.ZipFile('data.zip','r')aszipobj:list()這會生成一種文獻(xiàn)列表:['file1.py','file2.py','file3.py','sub_dir/','sub_dir/bar.py','sub_dir/foo.py'].namelist()
返回存檔文獻(xiàn)中文獻(xiàn)和目錄的名稱列表。要檢索有關(guān)存檔文獻(xiàn)中文獻(xiàn)的信息,使用
.getinfo()
:importzipfilewithzipfile.ZipFile('data.zip','r')aszipobj:bar_info=zipobj.getinfo('sub_dir/bar.py')print(bar_info.file_size)這將輸出:15277.getinfo()
返回一種
ZipInfo
對象,該對象存儲有關(guān)存檔文獻(xiàn)的單個組員的信息。要獲取有關(guān)存檔文獻(xiàn)中文獻(xiàn)的信息,請將其途徑作為參數(shù)傳遞給
.getinfo()
。使用
getinfo()
,你可以檢索有關(guān)存檔文獻(xiàn)組員的信息,例如上次修改文獻(xiàn)的日期,壓縮大小及其完整文獻(xiàn)名。訪問
.file_size
將以字節(jié)為單位檢索文獻(xiàn)的原始大小。如下示例闡明怎樣在PythonREPL中檢索有關(guān)已歸檔文獻(xiàn)的更多詳細(xì)信息。假設(shè)已導(dǎo)入
zipfile模塊,bar_info
與在前面的示例中創(chuàng)立的對象相似:>>>bar_info.date_time(,10,7,23,30,10)>>>bar_press_size2856>>>bar_info.filename'sub_dir/bar.py'bar_info
包具有關(guān)
bar.py
的詳細(xì)信息,例如壓縮的大小及其完整途徑。第一行顯示了怎樣檢索文獻(xiàn)的上次修改日期。下一行顯示了怎樣在歸檔后獲取文獻(xiàn)的大小。最終一行顯示了存檔文獻(xiàn)中
bar.py
的完整途徑。ZipFile
支持上下文管理器協(xié)議,這就是你可以將它與with語句一起使用的原因。操作完畢后會自動關(guān)閉
ZipFile
對象。嘗試從已關(guān)閉的
ZipFile
對象中打開或提取文獻(xiàn)將導(dǎo)致錯誤。提取ZIP文獻(xiàn)zipfile
模塊容許你通過
.extract()
和
.extractall()
從ZIP文獻(xiàn)中提取一種或多種文獻(xiàn)。默認(rèn)狀況下,這些措施將文獻(xiàn)提取到目前目錄。它們都采用可選的途徑參數(shù),容許指定要將文獻(xiàn)提取到的其他指定目錄。假如該目錄不存在,則會自動創(chuàng)立該目錄。要從壓縮文獻(xiàn)中提取文獻(xiàn),請執(zhí)行如下操作:>>>importzipfile>>>importos>>>os.listdir('.')['data.zip']>>>data_zip=zipfile.ZipFile('data.zip','r')>>>#提取單個文獻(xiàn)到目前目錄>>>data_zip.extract('file1.py')'/home/test/dir1/zip_extract/file1.py'>>>os.listdir('.')['file1.py','data.zip']>>>#提所有文獻(xiàn)到指定目錄>>>data_zip.extractall(path='extract_dir/')>>>os.listdir('.')['file1.py','extract_dir','data.zip']>>>os.listdir('extract_dir')['file1.py','file3.py','file2.py','sub_dir']>>>data_zip.close()第三行代碼是對
os.listdir()
的調(diào)用,它顯示目前目錄只有一種文獻(xiàn)
data.zip
。接下來,以讀取模式下打開
data.zip
并調(diào)用
.extract()
從中提取
file1.py
。
.extract()
返回提取文獻(xiàn)的完整文獻(xiàn)途徑。由于沒有指定途徑,.extract()
會將
file1.py提取到目前目錄。下一行打印一種目錄列表,顯示目前目錄目前包括除原始存檔文獻(xiàn)之外的存檔文獻(xiàn)。之后顯示了怎樣將整個存檔提取到指定目錄中。.extractall()
創(chuàng)立
extract_dir
并將
data.zip
的內(nèi)容提取到其中。最終一行關(guān)閉ZIP存檔文獻(xiàn)。從加密的文檔提取數(shù)據(jù)zipfile
支持提取受密碼保護(hù)的ZIP。要提取受密碼保護(hù)的ZIP文獻(xiàn),請將密碼作為參數(shù)傳遞給
.extract()
或.extractall()
措施:>>>importzipfile>>>withzipfile.ZipFile('secret.zip','r')aspwd_zip:...#從加密的文檔提取數(shù)據(jù)...pwd_zip.extractall(path='extract_dir',pwd='Quish3@o')將以讀取模式打開
secret.zip
存檔。密碼提供應(yīng)
.extractall()
,并且壓縮文獻(xiàn)內(nèi)容被提取到
extract_dir
。由于with語句,在完畢提取后,存檔文獻(xiàn)會自動關(guān)閉。創(chuàng)立新的存檔文獻(xiàn)要創(chuàng)立新的ZIP存檔,請以寫入模式(w)打開
ZipFile
對象并添加要歸檔的文獻(xiàn):>>>importzipfile>>>file_list=['file1.py','sub_dir/','sub_dir/bar.py','sub_dir/foo.py']>>>withzipfile.ZipFile('new.zip','w')asnew_zip:...fornameinfile_list:...new_zip.write(name)在該示例中,new_zip
以寫入模式打開,file_list
中的每個文獻(xiàn)都添加到存檔文獻(xiàn)中。with語句結(jié)束后,將關(guān)閉
new_zip
。以寫入模式打開ZIP文獻(xiàn)會刪除壓縮文獻(xiàn)的內(nèi)容并創(chuàng)立新存檔文獻(xiàn)。要將文獻(xiàn)添加到既有的存檔文獻(xiàn),請以追加模式打開
ZipFile
對象,然后添加文獻(xiàn):>>>withzipfile.ZipFile('new.zip','a')asnew_zip:...new_zip.write('data.txt')...new_zip.write('latin.txt')這里打開在上一種示例中以追加模式創(chuàng)立的
new.zip
存檔。在追加模式下打開
ZipFile
對象容許將新文獻(xiàn)添加到ZIP文獻(xiàn)而不刪除其目前內(nèi)容。將文獻(xiàn)添加到ZIP文獻(xiàn)后,with語句將脫離上下文并關(guān)閉ZIP文獻(xiàn)。打開TAR存檔文獻(xiàn)TAR文獻(xiàn)是像ZIP等未壓縮的文獻(xiàn)存檔。它們可以使用
gzip,bzip2
和
lzma
壓縮措施進(jìn)行壓縮。
TarFile
類容許讀取和寫入TAR存檔。下面是從存檔中讀取:importtarfilewithtarfile.open('example.tar','r')astar_file:print(tar_file.getnames())tarfile
對象像大多數(shù)類似文獻(xiàn)的對象同樣打開。它們有一種
open()
函數(shù),它采用一種模式來確定文獻(xiàn)的打開方式。使用“r”,“w”或“a”模式分別打開未壓縮的TAR文獻(xiàn)以進(jìn)行讀取,寫入和追加。要打開壓縮的TAR文獻(xiàn),請將模式參數(shù)傳遞給
tarfile.open(),其格式為
filemode[:compression]
。下表列出了可以打開TAR文獻(xiàn)的也許模式:|模式|行為||-----|-----------------------------||r|以無壓縮的讀取模式打開存檔||r:gz|以gzip壓縮的讀取模式打開存檔||r:bz2|以bzip2壓縮的讀取模式打開存檔||w|以無壓縮的寫入模式打開存檔||w:gz|以gzip壓縮的寫入模式打開存檔||w:xz|以lzma壓縮的寫入模式打開存檔||a|以無壓縮的追加模式打開存檔|.open()
默認(rèn)為'r'模式。要讀取未壓縮的TAR文獻(xiàn)并檢索其中的文獻(xiàn)名,請使用
.getnames():>>>importtarfile>>>tar=tarfile.open('example.tar',mode='r')>>>tar.getnames()['CONTRIBUTING.rst','README.md','app.py']這以列表的方式返回存檔中內(nèi)容的名字。注意:為了向你展示怎樣使用不一樣的tarfile對象措施,示例中的TAR文獻(xiàn)在交互式REPL會話中手動打開和關(guān)閉。
通過這種方式與TAR文獻(xiàn)交互,你可以查看運行每個命令的輸出。一般,你也許但愿使用上下文管理器來打開類似文獻(xiàn)的對象。此外可以使用特殊屬性訪問存檔中每個條目的元數(shù)據(jù):>>>forentryintar.getmembers():...print()...print('Modified:',time.ctime(entry.mtime))...print('Size:',entry.size,'bytes')...print()CONTRIBUTING.rstModified:SatNov109:09:51Size:402bytesREADME.mdModified:SatNov307:29:40Size:5426bytesapp.pyModified:SatNov307:29:13Size:6218bytes在此示例中,循環(huán)遍歷
.getmembers()
返回的文獻(xiàn)列表,并打印出每個文獻(xiàn)的屬性。.getmembers()
返回的對象具有可以通過編程方式訪問的屬性,例如歸檔中每個文獻(xiàn)的名稱,大小和上次修改時間。在讀取或?qū)懭氪鏅n后,必須關(guān)閉它以釋放系統(tǒng)資源。從TAR存檔中提取文獻(xiàn)在本節(jié)中,你將學(xué)習(xí)怎樣使用如下措施從TAR存檔中提取文獻(xiàn):.extract().extractfile().extractall()要從TAR存檔中提取單個文獻(xiàn),請使用
extract()
,傳入文獻(xiàn)名:>>>tar.extract('README.md')>>>os.listdir('.')['README.md','example.tar']README.md
文獻(xiàn)從存檔中提取到文獻(xiàn)系統(tǒng)。調(diào)用
os.listdir()
確認(rèn)
README.md
文獻(xiàn)已成功提取到目前目錄中。要從存檔中解壓縮或提取所有內(nèi)容,請使用
.extractall()
:>>>tar.extractall(path="extracted/").extractall()
有一種可選的
path
參數(shù)來指定解壓縮文獻(xiàn)的去向。這里,存檔被提取到
extracted
目錄中。如下命令顯示已成功提取存檔:$lsexample.tarextractedREADME.md$tree.├──example.tar├──extracted|├──app.py|├──CONTRIBUTING.rst|└──README.md└──README.md1directory,5files$lsextracted/app.pyCONTRIBUTING.rstREADME.md要提取文獻(xiàn)對象以進(jìn)行讀取或?qū)懭耄埵褂?/p>
.extractfile()
,它接受文獻(xiàn)名或
TarInfo
對象作為參數(shù)。
.extractfile()
返回一種可以讀取和使用的類文獻(xiàn)對象:>>>f=tar.extractfile('app.py')>>>f.read()>>>tar.close()打開的存檔應(yīng)在讀取或?qū)懭牒笠恢标P(guān)閉。要關(guān)閉存檔,請在存檔文獻(xiàn)句柄上調(diào)用
.close()
,或在創(chuàng)立
tarfile對象時使用with語句,以便在完畢后自動關(guān)閉存檔。這將釋放系統(tǒng)資源,并將你對存檔所做的任何更改寫入文獻(xiàn)系統(tǒng)。創(chuàng)立新的TAR存檔創(chuàng)立新的TAR存檔,你可以這樣操作:>>>importtarfile>>>file_li
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度餐廳廚房特色菜品推廣與銷售合同3篇
- 專業(yè)綠化養(yǎng)護(hù)承包合同:2024年廠區(qū)綠化項目版B版
- 二零二五年度專業(yè)廚房設(shè)備維修保養(yǎng)合同3篇
- 2025年度板材行業(yè)節(jié)能減排技術(shù)應(yīng)用采購合同4篇
- 2025地區(qū)代理合同專業(yè)版(合同版本)
- 煤炭設(shè)備安裝施工合同
- 2025年動產(chǎn)擔(dān)保抵押合同
- 2025年商標(biāo)權(quán)續(xù)展合同范本
- 水電承包合同范本2024
- 2025采石承包合同書范文
- 江西省部分學(xué)校2024-2025學(xué)年高三上學(xué)期1月期末英語試題(含解析無聽力音頻有聽力原文)
- 農(nóng)民工工資表格
- 【寒假預(yù)習(xí)】專題04 閱讀理解 20篇 集訓(xùn)-2025年人教版(PEP)六年級英語下冊寒假提前學(xué)(含答案)
- 2024年智能監(jiān)獄安防監(jiān)控工程合同3篇
- 2024年度窯爐施工協(xié)議詳例細(xì)則版B版
- 幼兒園籃球課培訓(xùn)
- 基底節(jié)腦出血護(hù)理查房
- 工程公司總經(jīng)理年終總結(jié)
- 【企業(yè)盈利能力探析的國內(nèi)外文獻(xiàn)綜述2400字】
- 統(tǒng)編版(2024新版)七年級《道德與法治》上冊第一單元《少年有夢》單元測試卷(含答案)
- 蘇教版(2024新版)一年級上冊科學(xué)全冊教案教學(xué)設(shè)計
評論
0/150
提交評論