Python3筆記049 - 10.2 目錄操作
第10章 檔案及目錄操作
10.2 目錄操作
目錄操作:建立、遍歷、刪除、拷貝、路徑、判斷
1、os模組
# 獲取當前作業系統型別
import os
t = os.name
print(t)
output:
nt
# 獲取當前作業系統路徑分隔符
import os
t = os.sep
print(t)
output:
\
2、路徑
定義:用於定位一個檔案或目錄的字串被稱為一個路徑,分為絕對路徑和相對路徑
- 相對路徑
當前工作目錄:是指當前檔案所在的目錄,可用getcwd()函式獲取。
# 獲取當前的工作目錄 import os t = os.getcwd() print(t) output: D:\01Python\pythonbasic
在表示路徑的字串前面加上字母r,那麼該字元將原樣輸出
- 絕對路徑
絕對路徑是指在使用檔案時指定檔案的實際路徑,它不依賴於當前目錄。可以用abspath()函式獲取一個檔案的絕對路徑
# 絕對路徑用os.path.abspath(path)
import os
t = os.path.abspath("work1.txt")
print(t)
output:
D:\01Python\pythonbasic\work1.txt
- 拼接路徑
將兩個或多個路徑拼接在一起,可使用os.path模組提供的join()函式
# 拼接路徑用os.path.join(path1[,path2[,......]])
3、判斷檔案或目錄是否存在
# 判斷檔案是否存在用os.path.exists(path)
import os
t = os.path.exists("work1.txt")
print(t)
output:
True
4、建立目錄
os.mkdir(path,mode=0o777) # 建立一級目錄
# 遞迴的建立目錄
import os
os.makedirs('tmp/python/fileop',exist_ok=True)
會在當前工作目錄下面建立 tmp目錄,在tmp目錄下面再建立 python目錄,在Python目錄下面再建立fileop目錄
exist_ok=True
5、刪除目錄
os.rmdir(path) # 只能刪除空目錄
import shutil
shutil.rmtree("C:\\demo\\test") # 遞迴刪除目錄,刪除非空目錄
shutil.rmtree() 可以遞迴的刪除某個目錄所有的子目錄和子檔案
import shutil
shutil.rmtree('tmp')
# 遞迴刪除某一目錄下的子目錄及檔案用rmtree方法
import shutil
filename = r"D:\01Python\pythonbasic\work1"
if os.path.exists(filename) == True:
shutil.rmtree(filename)
if os.path.exists(filename) == False:
print("目錄存在,已被刪除!")
else:
print("目錄不存在,未執行刪除操作!")
顯示目錄
列出某一目錄下所有檔案和目錄
# 顯示目錄用os.listdir("路徑"),類似於dir
import os
t = os.listdir(r"d:\01python\pythonbasic")
print(t)
output:
['class.py', 'dict.py', 'file.py', 'func.py', 'keywordlist.py', 'list.py', 'r1.txt', 'string1.py', 'sum1-100.py', 'traversal_strings.py', 'while.py', 'with_as.py', 'work1.txt', '__init__.py', '測試工匠麻辣燙部落格.png']
6、遍歷目錄
os模組的walk()函式用於遍歷目錄
os.walk(top[,topdown][,onerror][,followlinks])
import os
path = "C:\\demo"
print("【",path,"】目錄下包括的檔案和目錄")
for root, dirs, files in os.walk(path, topdown=True):
for name in dirs:
print(".",os.path.join(root,name))
for name in files:
print("。",os.path.join(root,name))
7、拷貝目錄
如果我們要拷貝一個目錄裡面所有的內容(包括子目錄和檔案、子目錄裡面的子目錄和檔案,等等)到另外一個目錄中,可以使用 shutil的copytree函式。
如下所示
from shutil import copytree
# 拷貝 d:/tools/aaa 目錄中所有的內容 到 e:/bbb 中
copytree('d:/tools/aaa', 'e:/new/bbb')
注意拷貝前, 目標目錄必須 不存在
,否則會報錯。
上面的程式碼執行前面,如果 e:/new/bbb 已經存在,執行到copytree時,就會報錯
上面的程式碼執行前面,如果 e:/new 這個目錄都不存在,執行到copytree時,就會 建立 e:/new 目錄,再建立 e:/new/bbb 目錄,再拷貝 d:/tools/aaa 目錄中所有的內容 到 e:/new/bbb 中。
上面的程式碼執行前面,如果 e:/new 這個目錄存在,但是 e:/new/bbb 不存在,執行到copytree時,就只會 建立 e:/new/bbb ,再拷貝 d:/tools/aaa 目錄中所有的內容 到 e:/new/bbb 中。
高階操作
判斷一個名字是目錄還是檔案
# 判斷一個名字是目錄還是檔案
os.path.isdir("名稱")判斷是不是目錄
os.path.isfile("名稱")判斷是不是檔案
import os
t = os.path.isdir(r"d:\01python\pythonbasic")
print(t)
f = os.path.isfile(r"d:\01python\pythonbasic\work1.txt")
print(f)
output:
True
True
修改檔名、目錄名用os.rename()
# 修改檔名、目錄名用os.rename()
import os
# 修改目錄名 d:/tools/aaa 為 d:/tools/bbb
os.rename('d:/tools/aaa','d:/tools/bbb')
# 修改檔名 d:/tools/first.py 為 d:/tools/second.py
os.rename('d:/tools/first.py','d:/tools/second.py')
對路徑的操作
# 對於檔名的操作,比如 獲取檔名稱,檔案所在目錄,檔案路徑的拼接等,都可以使用 os.path 模組。
import os
p = r"d:\01python\pythonbasic\work1.txt"
t = os.path.basename(p) # 取檔名
print(t)
f = os.path.dirname(p) # 取目錄
print(f)
j = os.path.join(t, f, os.path.basename(p)) # 拼接
print(j)
output:
work1.txt
d:\01python\pythonbasic
d:\01python\pythonbasic\work1.txt
判斷檔案、目錄是否存在
# 判斷一個指定路徑的檔案或目錄是否存在用exists()
import os
os.path.exists('d:/systems/cmd.exe')
os.path.exists('d:/systems')
獲取檔案的大小和日期
import time
getsize = os.path.getsize(r"d:\01python\pythonbasic\work1.txt")
getmtime = time.ctime(os.path.getmtime(r"d:\01python\pythonbasic\work1.txt"))
print(getsize)
print(getmtime)
output:
88
Fri Jul 24 11:34:29 2020
遞迴的遍歷目錄下面所有的檔案
假如我們要獲取某個目錄中所有的 檔案, 包括子目錄裡面的檔案。 可以使用 os庫中的walk方法
比如我們要得到某個目錄下面所有的子目錄 和所有的檔案,存放在兩個列表中
可以這樣寫程式碼
import os
# 目標目錄
targetDir = r'd:\tmp\util\dist\check'
files = []
dirs = []
# 下面的三個變數 dirpath, dirnames, filenames
# dirpath 代表當前遍歷到的目錄名
# dirnames 是列表物件,存放當前dirpath中的所有子目錄名
# filenames 是列表物件,存放當前dirpath中的所有檔名
for (dirpath, dirnames, filenames) in os.walk(targetDir):
files += filenames
dirs += dirnames
print(fles)
print(dirs)
如果我們只需要獲取目錄中所有的檔案,或者只需要子目錄,可以這樣
import os
from os.path import isfile, join,isdir
# 目標目錄
targetDir = r'd:\tmp\util\dist\check'
# 所有的檔案
print([f for f in os.listdir(targetDir) if isfile(join(targetDir, f))])
# 所有的目錄
print([f for f in os.listdir(targetDir) if isdir(join(targetDir, f))])
得到目錄中指定副檔名的檔案和子目錄
# 可以使用glob庫
import glob
exes = glob.glob(r'd:\tmp\*.txt')
print(exes)