Python文件操作看這篇就足夠_第1頁
Python文件操作看這篇就足夠_第2頁
Python文件操作看這篇就足夠_第3頁
Python文件操作看這篇就足夠_第4頁
Python文件操作看這篇就足夠_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論