1. 程式人生 > 實用技巧 >Python3筆記049 - 10.2 目錄操作

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)