最後來講如何處理複雜的批量資料:
資料裡一定不只單一目錄或檔案,所以資料才可叫樹狀結構。
而透過指定目錄的套件是無法達到『尋訪』的功能的,只能把目標下看成單一物件處理
之前談到shutil可把指定檔案複製到指定目錄裡,但如果今天要顯示樹裡的資料 就須使用os裡的walk尋訪;使用起來直觀,且也支援多方法語句。
此套件工作模式類似結構演算法的搜尋,透過資料之間的樹狀結構建立一個遞迴的傳回值 如此反覆尋訪便可尋找符合指定方法的資料。
以dir_test目錄為例:
現在就把此資料樹作處理~
透過split可把路徑分開,而透過join就可把路徑結合起來。
以下是配合路徑的例子:
import os
a = int(input("要多少檔案?"))
for i in range(0, a):
i += 1
open("%d.js" % i, 'w+')
lnk = os.path.abspath("%d.js" % i) # 絕對路徑
lnk_n = lnk.split("\\")[-1]
jlnk = os.path.join("files name:" + lnk_n + "\n"+ "abs is:" + lnk)#輸出完整資訊
print(jlnk)
回到walk,輸出資料樹
os.walk是個方法,可把它看作探照燈。所以使用它必須讓它先『驅動』
觀察os.walk的運作模式:
發現原來以『層遞』之方式尋找檔案,那就可寫成巢迴圈:
import os
for path, dirname, filename in os.walk("dir_test"):
print(path)
for i in filename:
print(os.path.join(path + i))
Ex:(os.walk做成套件使用)
import os
class stree():
def tree_s():
ina = input("要顯示的目錄:")
for root, dirs, files in os.walk(ina):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))
return -1 # 遞迴EOF
if __name__ == "__main__": #讓import不輸出
stree.tree_s()
如果要整理一堆在目錄裡之相同副檔名或類似名稱的檔案,就可使用glob。
glob.glob("要顯示的路徑檔案或方法")
form glob import *
fsA = glob("exist.py"), glob("*dir.py"), glob("*.*")
for file in fsA:
print(file)
glob就是萬用字元的最佳應證,透過glob把" * "發揮的淋漓盡致。
最後的EX:(利用glob刪除子樹底下所有檔案<配合os.walk>)
import os
import glob
path_l = "15987650"
for path, dirname, filename in os.walk(path_l):
for i in filename:
#print(i)
for j in glob.glob(path+"/"+i):
try:
os.remove(j)
except:
pass