作者 | Jeff Hale?
譯者 | 風(fēng)車(chē)云馬; 責(zé)編 | Jane,Rachel
出品 | Python大本營(yíng)(ID:pythonnews)
【導(dǎo)讀】在編寫(xiě)一些Python程序的時(shí)候,我們常常需要與文件系統(tǒng)進(jìn)行交互。在本文中,營(yíng)長(zhǎng)為大家整理了10個(gè)常用的相關(guān)命令,涉及查看信息、更改信息、刪除文件等,并提供了相應(yīng)的終端命令,幫助大家更高效地對(duì)文件系統(tǒng)及其中的文件內(nèi)容進(jìn)行操作。
?
通過(guò)一個(gè)能夠?qū)崿F(xiàn)與文件系統(tǒng)進(jìn)行交互的Python程序,我們可以實(shí)現(xiàn)很多有趣的應(yīng)用,但是大部分人并不知道如何實(shí)現(xiàn)這種交互。 本文為相關(guān)研發(fā)人員和數(shù)據(jù)科學(xué)家提供了一個(gè)實(shí)現(xiàn)指南,并重點(diǎn)介紹10個(gè)基本的os和shutil命令,以便通過(guò)腳本實(shí)現(xiàn)Python程序與文件系統(tǒng)的自動(dòng)交互。
文件系統(tǒng)和一棟房子的結(jié)構(gòu)相似。在每次進(jìn)行大掃除的時(shí)候,我們都需要將很多箱的文件從一個(gè)屋子移動(dòng)到另一個(gè)屋子,這和使用Python移動(dòng)文件的操作很像。
文件目錄則像裝滿了東西的箱子,只不過(guò)在文件系統(tǒng)中,裝的都是系統(tǒng)中存儲(chǔ)的文件。
裝在箱子中的筆記本,就像電腦中存儲(chǔ)的文件,我們可以對(duì)其進(jìn)行讀/寫(xiě),也可以把它們存放在目錄中。
?
這個(gè)指南介紹了os和shutil模塊中的相關(guān)方法。其中,os模塊主要用于與操作系統(tǒng)交互,shutil模塊則包含一些針對(duì)文件的操作。一般情況下,我們使用os創(chuàng)建目錄,使用shutil移動(dòng)和復(fù)制文件。
?
Python標(biāo)準(zhǔn)庫(kù)更新:2019年2月16日新增pathlib庫(kù)
?
在 Python 3.4 版本,標(biāo)準(zhǔn)庫(kù)中增加了 pathlib 模塊,以改進(jìn)文件路徑的處理;在3.6版本中,增加了更多pathlib與標(biāo)準(zhǔn)庫(kù)的其他模塊的交互,效果很好。pathlib將路徑視為對(duì)象而非字符串,這使得其在解析文件路徑上具有一定優(yōu)勢(shì)。如果你想要對(duì)pathlib有更多了解,可以閱讀 Real Python 和 pbpython 提供的介紹。雖然pathlib 很方便,但它不具備我們將要探索的一些底層功能。因此,使用 os 和shutil 方法還是有必要的。? ?
?
在進(jìn)行更詳細(xì)的介紹之前,有以下幾點(diǎn)需要注意:
-
本指南是基于 python3,2020年1月以后將不再支持 python 2 。
-
在使用相關(guān)命令之前,需要在代碼開(kāi)頭導(dǎo)入了 os 和 shutil 庫(kù)。
-
我的示例代碼可以在GitHub上找到。
-
請(qǐng)使用自己的參數(shù)替換下面引號(hào)中的參數(shù)。
?
下面, 本文將逐一介紹文件系統(tǒng)的 10 種命令方法,每個(gè)部分都會(huì)按照“方法:描述→對(duì)應(yīng)的 macOS ?Shell 命令”模式進(jìn)行介紹,便于大家理解。
?
一、獲取信息(Get Info)
?
-
os.getcwd():以字符串形式獲取當(dāng)前工作目錄路徑 →?pwd
-
os.listdir()?:以字符串列表的形式獲取當(dāng)前工作目錄的內(nèi)容→ls
-
os.walk("starting_directory_path"):返回一個(gè)生成器(generator),該生成器包含當(dāng)前目錄和所有子目錄中的文件名稱(chēng)及路徑信息;→沒(méi)有完全等價(jià)的shell命令,不過(guò) ls -R 命令提供了子目錄名稱(chēng)和子目錄中的文件名稱(chēng)
?
二、更改信息(Change Things)
?
-
os.chdir("/absolute/or/relative/path"):更改當(dāng)前的工作路徑→ cd
-
os.path.join():創(chuàng)建路徑供后續(xù)使用→ 沒(méi)有等效的命令
-
os.makedirs(“dir1 / dir2”):創(chuàng)建目錄→ mkdir - p
-
shutil.copy2("source_file_path","destination_directory_path"):復(fù)制文件或目錄→ cp
-
shutil.move("source_file_path","destination_directory_path"):移動(dòng)文件或目錄→ mv
-
os.remove(“my_file_path”):刪除文件→ rm
-
shutil.rmtree(“my_directory_path”):刪除路徑及其包含的所有文件和目錄→ rm –rf
?
以上是對(duì)十個(gè)最常用、基礎(chǔ)的文件系統(tǒng)方法的初步介紹,接下來(lái)我們?cè)偕钊胫v解一些重要的模塊和使用方法。
?
查看信息
os.getcwd()
以字符串形式返回當(dāng)前工作目錄
os.listdir()
以字符串列表形式返回當(dāng)前目錄
os.walk("my_start_directory")
創(chuàng)建一個(gè)生成器,用于返回關(guān)于當(dāng)前目錄和子目錄的信息。在起始指定的目錄中有效。
?
os.walk() 遍歷包含的每個(gè)目錄后,都會(huì)返回下列項(xiàng):
(1)當(dāng)前目錄路徑(字符串類(lèi)型)
(2)當(dāng)前目錄下的子目錄名稱(chēng)(字符串列表類(lèi)型)
(3)當(dāng)前目錄中的文件名稱(chēng)(字符串列表類(lèi)型的)
?
使用帶有for循環(huán)的os.walk()來(lái)遍歷目錄及其子目錄的內(nèi)容通常很有用。例如,下面的代碼將打印當(dāng)前工作目錄的目錄和子目錄中的所有文件。
import os
cwd = os.getcwd()
for dir_path, dir_names, file_names in os.walk(cwd):
for f in file_names:
print(f)
以上是獲取信息的操作。下面讓我們一起看一下更改工作目錄或移動(dòng)、復(fù)制、刪除文件系統(tǒng)的命令。
os.chdir("/absolute/or/relative/path")
此方法將當(dāng)前工作路徑更改為絕對(duì)路徑或相對(duì)路徑。
如果隨后要對(duì)文件系統(tǒng)進(jìn)行其他更改,在試用該方法時(shí)留意處理任何異常。否則,您可能正在刪除不希望刪除的目錄或文件。
os.path.join()
os.path模塊提供了許多用于路徑名操作的有用方法。您可以使用它查找有關(guān)目錄名稱(chēng),或者目錄名稱(chēng)的部分信息。該模塊還可以用來(lái)檢查文件或目錄是否存在。
?
os.path.join()提供將多個(gè)字符串完美連接在一起的文件路徑,而且是在大多數(shù)操作系統(tǒng)上都可以工作的路徑。該模塊文檔的描述為,該命令可以“更加智能的連接一個(gè)或多個(gè)路徑組件,返回值是路徑或路徑的任何成員路徑的連接,每個(gè)非空路徑后都有一個(gè)目錄分隔符(os.sep),最后一個(gè)除外”。
?
另外,如果使用的是Unix或macOS系統(tǒng),os.path.join()會(huì)在每個(gè)字符串之間添加一個(gè)斜杠(" / ")來(lái)創(chuàng)建路徑。如果操作系統(tǒng)需要“\”,那么join會(huì)自動(dòng)使用反斜杠。
?
os.path.join()還向其他開(kāi)發(fā)人員提供了創(chuàng)建路徑的明確信息。強(qiáng)烈建議讀者多使用這個(gè)命令,不要每次都手動(dòng)添加斜杠。
os.makedirs("dir1/dir2")
os.makedirs()能夠生成目錄。mkdir()方法也可以生成目錄,但它不生成中間目錄。所以建議使用os.makedirs()。
shutil.copy2("source_file", "destination")
在Python中復(fù)制文件和目錄的方法有很多,但建議使用此命令。shutil.copy2()的優(yōu)勢(shì)在于,它盡可能地保留了源文件的元數(shù)據(jù)。如果你希望對(duì)文件和努力的復(fù)制有更多了解,可以閱讀這篇文章。?
移動(dòng)文件
shutil.move("source_file", "destination")
使用shutil.move()更改文件的位置。它使用 copy2 作為后臺(tái)參數(shù)默認(rèn)值。
os.remove("my_file_path")
當(dāng)需要?jiǎng)h除文件時(shí),可以使用os.remove()工具。
shutil.rmtree("my_directory_path")
shutil.rmtree()刪除一個(gè)目錄及其中的所有文件和目錄。
刪除文件
使用刪除函數(shù)的時(shí)候一定要多加小心!您可以使用print()將要?jiǎng)h除的內(nèi)容打印出來(lái),在確定不會(huì)刪除錯(cuò)誤文件后,再用相應(yīng)的刪除文件函數(shù)替換print()。在此向Al Sweigart致敬,感謝他在文章《Automate the Boring Stuff with Python》中進(jìn)行的討論。
?
最后我們?cè)倩仡櫼幌抡麄€(gè)方法。
?
10種文件系統(tǒng)方法概述
下面方法遵循這個(gè)模式:方法——描述——等效macOS Shell命令
?
獲取信息
-
os.getcwd()?——以字符串形式獲取當(dāng)前工作目錄路徑——?pwd
-
os.listdir()?——以字符串列表的形式獲取當(dāng)前工作目錄的內(nèi)容——ls
-
os.walk("starting_directory_path")——返回函數(shù),其中包含當(dāng)前目錄和所有子目錄中的目錄和文件的名稱(chēng)和路徑信息——沒(méi)有完全等價(jià)的shell命令,不過(guò)ls -R提供了子目錄名稱(chēng)和子目錄中的文件名稱(chēng)
改動(dòng)信息
-
os.chdir("/absolute/or/relative/path")?——改變當(dāng)前的工作路徑——cd
-
os.path.join()——?jiǎng)?chuàng)建路徑供后續(xù)使用——沒(méi)有等效CLI
-
os.makedirs (“dir1 / dir2”)——?jiǎng)?chuàng)建目錄——mkdir - p
-
shutil.copy2("source_file_path","destination_directory_path")——復(fù)制文件或目錄——cp
-
shutil.move("source_file_path","destination_directory_path")——移動(dòng)文件或目錄——mv
-
os.remove (“my_file_path”)——?jiǎng)h除文件——rm
-
shutil.rmtree (“my_directory_path”)——?jiǎng)h除路徑及其包含的所有文件和目錄——rm –rf
以上介紹了關(guān)于Python與文件系統(tǒng)交互的一些基礎(chǔ)知識(shí)。希望大家在Ipython編輯器中多嘗試這些命令,并向其他人解釋這些方法,以更好的掌握和鞏固知識(shí)。
?
如果你想對(duì)相關(guān)內(nèi)容有更多了解,可以看看免費(fèi)的電子書(shū),或者多用Python編編代碼。關(guān)于使用Python從文件中讀寫(xiě)的相關(guān)操作,請(qǐng)查看open函數(shù)的官方文檔。
原文鏈接:
https://towardsdatascience.com/10-python-file-system-methods-you-should-know-799f90ef13c2
(*本文為 AI科技大本營(yíng)轉(zhuǎn)載文章,轉(zhuǎn)載請(qǐng)聯(lián)系原作者)
◆
精彩推薦
◆
推薦閱讀
-
“愛(ài)裝X”開(kāi)源組織:“教科書(shū)級(jí)”AI知識(shí)樹(shù)究竟長(zhǎng)什么樣?
-
MNIST重生,測(cè)試集增加至60000張!
-
基礎(chǔ)必備 | Python處理文件系統(tǒng)的10種方法
-
500行Python代碼打造刷臉考勤系統(tǒng)
-
前端開(kāi)發(fā)20年變遷史
-
剛出爐!AI指數(shù)報(bào)告:AI人才需求暴漲35倍,薪酬問(wèn)鼎No.1
-
ARM 發(fā)布新一代CPU和GPU,實(shí)現(xiàn)20%性能提升!
-
北漂杭漂的程序員,是如何買(mǎi)到第一套房子?
-
權(quán)游播完了, 你在罵爛尾, 有人卻悄悄解鎖了新操作……
點(diǎn)擊閱讀原文,查看更多精彩內(nèi)容。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
