Python 文件夾及文件操作
我們經常會與文件和目錄打交道,對於這些操作,python可以使用 os 及 shutill 模塊,其中包含了很多操作文件和目錄的函數。
os 可以執行簡單的文件夾及文件操作,引入用 import os,可用 help(os) 或是 dir(os) 查看其用法。注意有些函數在os模塊中,有的是在os.path模塊中。
shutil 模塊提供了大量的文件的高級操作,特別針對文件拷貝和刪除。主要功能為目錄和文件操作以及壓縮操作。須引入 import shutil ,具體 help。本文僅介紹移動、復制及刪除。
可先在 D:\ 下創建文件夾 Python_os , 再在其下創建文件夾 os, 再在其下創建 test.txt;之后的示例會在該文件夾下操作
判斷路徑或文件
os.path.isabs(...) # 判斷是否絕對路徑
os.path.exists(...) # 判斷是否真實存在
os.path.isdir(...) # 判斷是否是個目錄
os.path.isfile(...) # 判斷是否是個文件
注意: 把兩個路徑合成一個時,不要直接拼字符串,而要通過 os.path.join(part1,part2)
函數,這樣可以正確處理不同操作系統的路徑分隔符。在Linux/Unix/Mac下,os.path.join()
返回這樣的字符串: part1/part2
而Windows下會返回這樣的字符串: part1\part2
1 import os 2 import shutil 3 4 file_dir = "D:\\Python_os\\os" # 注意 \\ ;windows 下是這么表示的;Linux 和 Mac 是 / 5 file_name = "test.txt" 6 file_abs = os.path.join(file_dir, file_name) # os.path.join(...) 表示路徑鏈接 7 8 9 '''判斷路徑或文件''' 10 print (1,os.path.isabs(file_dir)) # 判斷是否絕對路徑 11 print (2,os.path.isabs(file_name)) 12 print (3,os.path.isabs(file_abs)) 13 print (4,os.path.exists(file_abs)) # 判斷是否真實存在 14 print (5,os.path.exists(os.path.join(file_dir,"xxx"))) 15 print (6,os.path.isdir(file_dir)) # 判斷是否是個目錄 16 print (7,os.path.isdir(file_abs)) 17 print (8,os.path.isfile(file_dir)) # 判斷是否是個文件 18 print (9,os.path.isfile(file_abs))
運行結果:
路徑名、文件名分隔
os.path.split(...) # 分隔目錄和文件名/文件夾名
os.path.splitdrive(...) # 分隔盤符(windows系統)
os.path.splitext(...) # 分隔文件和擴展名
運行結果:
這些合並、拆分路徑的函數並不要求目錄和文件要真實存在,它們只對字符串進行操作。
工作目錄及創建文件夾操作
os.getcwd() # 獲取當前工作目錄
os.chdir(...) # 改變工作目錄
os.listdir(...) # 列出目錄下的文件
os.mkdir(...) # 創建單個目錄 注意:創建多級用 os.makedirs()
os.makedirs(...) # 創建多級目錄
1 import os 2 3 file_dir = "D:\\Python_os\\os" 4 5 print (os.getcwd()) # 獲取當前工作目錄 6 os.chdir(file_dir) # 改變工作目錄 7 print (os.getcwd()) 8 print (os.listdir(file_dir)) # 列出當前工作目錄的所有文件 Python2 不支持 os.listdir() Python3 會列出當前工作目錄下的所有文件 9 os.mkdir("test_mkdir") # 在當前工作目錄下創建文件夾 test_mkdir;注意不可存在相同文件夾,不然會報錯 10 os.makedirs("test_mkdir\\test1") 11 os.chdir(".\\test_mkdir") # . 表示本級目錄; .. 表示上級目錄 12 print (os.getcwd()) 13 for i in range(2,6): # 使用for循環等,可方便的創建多個文件夾 14 dir_name = "test" + str(i) 15 os.mkdir(dir_name)
在執行了上述實例代碼后,os 文件夾中新建了空的 test_mkdir 文件夾,而 test_dir 文件夾下也新建出了 test1 至 test5 的空文件夾
創建文件夾可能會出錯,原因具體有:(1) path 已存在時(不管是文件還是文件夾) (2) 驅動器不存在 (3) 磁盤已滿 (4) 磁盤是只讀的或沒有寫權限
文件的創建及操作參見下一章節
刪除文件夾/文件
os.rmdir(...) # 刪除空文件夾 注意:必須為空文件夾 如需刪除文件夾及其下所有文件,需用 shutil
os.remove(...) # 刪除單一文件
shutil.rmtree(...) # 刪除文件夾及其下所有文件
在上方示例的文件夾基礎上,操作刪除 test1 文件夾 (空文件夾可用 os.rmdir() ),刪除 test_mkdir 及其下所有文件();示例代碼如下
1 import os 2 import shutil 3 4 file_dir = "D:\\Python_os\\os" 5 6 ''' 刪除文件/文件夾 ''' 7 os.chdir(file_dir+"\\test_mkdir") 8 print(os.getcwd()) # 確保當前工作目錄 9 print(os.listdir(os.getcwd())) # 查看當前文件夾下所有文件 10 os.rmdir("test1") # 刪除 test1 文件夾(空文件夾) 11 print(os.listdir(os.getcwd())) 12 os.chdir("..\\") 13 print(os.getcwd()) # 切換到上級目錄 14 print(os.listdir(os.getcwd())) 15 shutil.rmtree("test_mkdir") # 刪除 test_mkdir 及其下所有文件
可見運行結果如下;產生異常的可能原因: (1) 路徑不存在 (2) 路徑子目錄中有文件或下級子目錄(os.rmdir) (3) 沒有操作權限或只讀
只是刪除單一文件,則用 os.remove("test.txt") 即可;產生異常的可能原因: (1) 文件不存在 (2) 對該文件沒有操作權限或只讀。
重命名文件夾/文件
可對某一文件或文件夾重命名 os.rename(oldfileName, newFilename)
在os文件夾中新建文件夾 test,文件 test.txt
1 ''' 重命名文件夾/文件 ''' 2 os.chdir(file_dir) 3 print(os.listdir(os.getcwd())) 4 os.rename("test","test1") 5 os.rename("test.txt","test1.txt") # 重命名,注意需要帶擴展名 6 print(os.listdir(os.getcwd()))
可見運行結果如下;產生異常的可能原因: (1) oldfilename 舊文件名不存在(文件須帶擴展名) (2)newFilename 新文件已經存在
注意:新文件的擴展名不能遺漏,理論上需要保持類型一致;但這也不失為改文件類型的一種方式(相當於直接改文件的擴展名)
復制、移動文件夾/文件
須使用 shutil 模塊,引入 import shutil
shutil.copyfile("old","new") # 復制文件,都只能是文件
shutil.copytree("old","new") # 復制文件夾,都只能是目錄,且new必須不存在
shutil.copy("old","new") # 復制文件/文件夾,復制 old 為 new(new是文件,若不存在,即新建),復制 old 為至 new 文件夾(文件夾已存在)
shutil.move("old","new") # 移動文件/文件夾至 new 文件夾中
我們現在 D:\ 下創建新文件夾 Python_shutil ,然后工作目錄切到該目錄,直接使用 Python 來操作吧,參考代碼如下:
1 import os 2 import shutil 3 4 os.chdir("D:\\") 5 os.mkdir("Python_shutil") 6 file_dir = "D:\\Python_shutil" 7 os.chdir(file_dir)
為演示復制、移動操作,我們在該文件夾下手動操作 新建文件夾 test_org、 test_copy 及 test_move; 新建文件 test.txt test1.txt , 兩者內容不同
Python 復制、移動的操作示例代碼如下:
1 import os 2 import shutil 3 4 file_dir = "D:\\Python_shutil" 5 os.chdir(file_dir) 6 shutil.copyfile("test_org.txt","test_copy.txt") # copy test_org.txt 為 test_copy.txt 若存在,則覆蓋 7 shutil.copyfile("test_org.txt","test1.txt") # 存在,覆蓋 8 shutil.copytree("test_org","test_copytree") # copy test_org 為 test_copytree(不存在的新目錄) 9 shutil.copy("test_org.txt","test_copy1.txt") # 同 copyfile 10 shutil.copy("test_org.txt","test_copy") # 將文件 copy 至 目標文件夾中(須存在) 11 shutil.copy("test_org.txt","test_xxx") # 將文件 copy 至 目標文件(該文件可不存在,注意類型!) 12 print os.listdir(os.getcwd()) 13 shutil.move("test_org.txt","test_move") # 將文件 move 至 目標文件夾中 14 shutil.move("test_org","test_move") # 將文件夾 move 至 目標文件夾中 15 print os.listdir(os.getcwd())