使用os和shutil操作文件和文件夾
你可以編寫Python程序來與文件系統(tǒng)進(jìn)行交互來做很酷的事情。怎么做并不總是非常清楚。本文是當(dāng)前和有抱負(fù)的開發(fā)人員和數(shù)據(jù)科學(xué)家的指南。我們將重點介紹10個基本的 os 和 shutil 命令,以便您可以編寫腳本來自動化與文件系統(tǒng)的交互。
像文件系統(tǒng)一樣文件系統(tǒng)有點像房子。假設(shè)您正在進(jìn)行春季清潔,您需要將筆記本盒從一個房間移動到另一個房間。
目錄就像盒子。他們持有東西。這些盒子就像目錄一樣。他們持有東西。在這種情況下,筆記本。
筆記本就像文件一樣。您可以讀取和寫入它們。您可以將它們放在目錄框中。Capiche?
在本指南中,我們將介紹 os 和 shutil 模塊中的方法。所述 OS 模塊是用于與操作系統(tǒng)進(jìn)行交互的主要Python模塊。該 shutil 模塊還包含了高層次的文件操作。出于某種原因,您使用 操作系統(tǒng)創(chuàng)建目錄,但移動并使用 shutil 復(fù)制它們。去搞清楚。:smirk:。
更新:于2019年2月16日增加的pathlib
在Python 3.4中, pathlib 模塊被添加到標(biāo)準(zhǔn)庫中以改進(jìn)文件路徑的使用,從3.6開始,它與標(biāo)準(zhǔn)庫的其余部分很好地配合使用。該 pathlib 方法提供了我們將在下面討論的方法解析文件路徑一些好處-即 pathlib將 路徑作為對象而不是字符串。雖然 pathlib 很方便,但它沒有我們將要探索的所有低級功能。此外,您無疑會在未來幾年 內(nèi)在 代碼中看到 os 和 shutil 方法。所以熟悉它們絕對是個好主意。
我打算在以后的文章中討論 pathlib ,所以請跟我來確保你不要錯過它。要立即了解有關(guān) pathlib 模塊的更多信息,請參閱 本文 和 本文 。
在我們挖掘之前要了解的其他一些事情:
本指南適用于Python 3.在2020年1月1日之后將不再支持Python 2 。您需要將os和shutil導(dǎo)入到您的文件中才能使用這些命令。我的示例代碼可以在GitHub上找到。用下面引號中的參數(shù)替換你自己的參數(shù)?,F(xiàn)在我們已經(jīng)完成了背景,讓我們開始吧!這是您應(yīng)該知道的10個命令的列表。
10文件系統(tǒng)方法
下面的列表遵循以下模式:
方法 - 描述 - 等效的macOS Shell命令
獲取信息
os.getcwd() - 將當(dāng)前工作目錄路徑作為字符串 - pwdos.listdir() - 獲取當(dāng)前工作目錄的內(nèi)容作為字符串列表lsos.walk("starting_directory_path")- 返回一個生成器,其中包含當(dāng)前目錄和所有子目錄中的目錄和文件的名稱和路徑信息 - 沒有確切的短CLI等效,但ls -R提供子目錄名稱和子目錄中文件的名稱改變一切
os.chdir("/absolute/or/relative/path") - 更改當(dāng)前工作目錄 - cdos.path.join()- 創(chuàng)建一個路徑供以后使用 - 沒有短的CLI等價物os.makedirs("dir1/dir2") - 制作目錄 - mkdir -pshutil.copy2("source_file_path", "destination_directory_path") - 復(fù)制文件或目錄 - cpshutil.move("source_file_path", "destination_directory_path") - 移動文件或目錄 - mvos.remove("my_file_path") - 刪除文件 - rmshutil.rmtree("my_directory_path")- 刪除目錄及其中的所有文件和目錄 - rm -rf來!我們討論一下。
歡迎大家加入小編創(chuàng)建的Python行業(yè)交流群,有大牛答疑,有資源共享,有企業(yè)招人!是一個非常不錯的交流基地!群號:556370268
獲取信息
os.getcwd() os.getcwd()以字符串形式返回當(dāng)前工作目錄。那一個是直截了當(dāng)?shù)摹?smile:
os.listdir() os.listdir()以字符串列表的形式返回當(dāng)前工作目錄的內(nèi)容。那一個也很簡單。:smile:
os.walk("my_start_directory")
os.walk() 創(chuàng)建一個生成器,可以返回有關(guān)當(dāng)前目錄和子目錄的信息。它通過指定的起始目錄中的目錄工作。
os.walk() 為它遍歷的每個目錄返回以下項:
1.當(dāng)前目錄路徑作為字符串當(dāng)。
2.當(dāng)前目錄中的子目錄名稱作為字符串列表。
3.當(dāng)前目錄中的文件名作為字符串列表。
它為每個目錄執(zhí)行此操作!
它的使用常常是有用的
os.walk() 一個 用于 循環(huán)遍歷目錄及其子目錄的內(nèi)容。例如,以下代碼將打印當(dāng)前工作目錄的目錄和子目錄中的所有文件。
import os
cwd = os.getcwd()
for dir_path, dir_names, file_names inos.walk(cwd):
for f in file_names:
print(f)這就是我們獲取信息的方式,現(xiàn)在讓我們看看更改工作目錄或移動,復(fù)制或刪除文件系統(tǒng)部分的命令。
改變一切
os.chdir("/absolute/or/relative/path")
此方法將當(dāng)前工作目錄更改為提供的絕對路徑或相對路徑。
如果您的代碼隨后對文件系統(tǒng)進(jìn)行了其他更改,那么在使用此方法和try-except時處理引發(fā)的任何異常都是一個好主意。否則,您可能正在刪除不想刪除的目錄或文件。:cry:
os.path.join() 該 os.path 模塊有許多用于常見路徑名操作的有用方法。您可以使用它來查找有關(guān)目錄名稱和目錄名稱部分的信息。該模塊還具有檢查文件或目錄是否存在的方法。
os.path.join() 通過將多個字符串連接到一個漂亮的文件路徑,可以創(chuàng)建一個適用于大多數(shù)操作系統(tǒng)的路徑.
這是 文檔中 的描述:
智能地加入一個或多個路徑組件。返回值是 路徑 和 *路徑的 任何成員的串聯(lián), os.sep 在每個非空部分之后只有一個目錄separator(),除了最后一個....
基本上,如果您使用的是Unix或macOS系統(tǒng),請 os.path.join() 在您提供的每個字符串之間添加正斜杠(“/”)以創(chuàng)建路徑。如果操作系統(tǒng)需要“\”,則 join 知道使用反斜杠。
os.path.join() 還向其他開發(fā)人員提供了您正在創(chuàng)建路徑的 明確信息 。絕對使用它而不是手動字符串連接,以避免看起來像一個菜鳥。:wink:
os.makedirs("dir1/dir2")
os.makedirs() 制作目錄。該 mkdir() 方法也可以創(chuàng)建目錄,但它不會創(chuàng)建中間目錄。所以我建議你使用 os.makedirs() 。
shutil.copy2("source_file", "destination") 有許多方法可以在Python中復(fù)制文件和目錄。shutil.copy2() 是一個很好的選擇,因為它試圖盡可能多地保留源文件的元數(shù)據(jù)。
移動?xùn)|西shutil.move("source_file", "destination")
使用 shutil.move() 更改文件的位置。它 copy2 在引擎蓋下用作默認(rèn)值。 os.remove("my_file_path") 有時您需要刪除文件。 os.remove() 是你的工具。
shutil.rmtree("my_directory_path")
shutil.rmtree() 刪除目錄及其中的所有文件和目錄。
刪除東西小心刪除東西的功能!您可能希望使用print()打印將作為空運(yùn)行刪除的內(nèi)容。然后在你確定它不會刪除錯誤的文件時,在你的刪除函數(shù)中運(yùn)行print()。在 使用Python自動化無聊的東西時, 向Al Sweigart提出了這個想法。這是完整的列表。
10文件系統(tǒng)方法回顧
下面的列表遵循以下模式: 方法 - 描述 - 等效的macOS Shell命令
獲取信息
os.getcwd() - 將當(dāng)前工作目錄路徑作為字符串 - pwd
os.listdir() - 獲取當(dāng)前工作目錄的內(nèi)容作為字符串列表 - ls
os.walk("starting_directory_path") - 返回一個生成器,其中包含當(dāng)前目錄和所有子目錄中的目錄和文件的名稱和路徑信息 - 沒有確切的短CLI等效,但 ls -R 提供子目錄名稱和子目錄中文件的名稱改變一切 os.chdir("/absolute/or/relative/path") - 更改當(dāng)前工作目錄 - cd
os.path.join() - 創(chuàng)建一個路徑供以后使用 - 沒有短的CLI等價物 os.makedirs("dir1/dir2") - 制作目錄 - mkdir-ps
hutil.copy2("source_file_path", "destination_directory_path") - 復(fù)制文件或目錄 - cp
shutil.move("source_file_path", "destination_directory_path") - 移動文件或目錄 - mv
os.remove("my_file_path") - 刪除文件 - rm
shutil.rmtree("my_directory_path") - 刪除目錄及其中的所有文件和目錄 - rm -rf
Wrap
現(xiàn)在您已經(jīng)看到了在Python中與文件系統(tǒng)交互的基礎(chǔ)知識。在IPython解釋器中嘗試這些命令以獲得快速反饋。然后向其他人解釋它們以鞏固您的知識。如果你在家里搬了一盒筆記本電腦,你就不那么痛了。:house:但是運(yùn)動會很好,所以現(xiàn)在你可以去健身房了。 ?♀?
如果你想深入了解,請查看免費(fèi)電子書 自動化Python的無聊東西 。
如果您想了解使用Python從文件中讀取和寫入,請查看 open 函數(shù) 。記得像這樣使用上下文管理器: with open(‘myfile’) as file: .:smile:
我希望你發(fā)現(xiàn)這個Python文件系統(tǒng)操作介紹很有用。如果您這樣做,請在您最喜歡的社交媒體渠道上分享,以便其他人也可以找到它。
我寫的是關(guān)于Python,Docker,數(shù)據(jù)科學(xué)等等。如果您對此感興趣,請 在此處 閱讀更多內(nèi)容并按照我的說明進(jìn)行操作。