亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

os 模塊操作文件與文件夾

在日常工作中,我們經常會和文件、文件夾打交道,比如將服務器上指定目錄下文件進行歸檔,或將爬蟲爬取的數據根據時間創建對應的文件夾 / 文件,如果這些還依靠手動來進行操作,無疑是費時費力的,這時候 Python 中的 os 模塊就必不可少了。本小節將圍繞 os 模塊的使用進行介紹。

1. os 模塊介紹

os 模塊是 Python 中的內置模塊,無需安裝即可使用,os 模塊提供非常豐富的方法用來處理文件和目錄。

os 模塊的使用步驟如下:

步驟 1:導入 os 模塊

import os

步驟 2:操作文件或者文件夾

通過 os 模塊提供的方法對文件、文件夾進行操作

2. os 模塊操作文件與文件夾

os 模塊是 Python 中操作文件與文件夾時常用的模塊,os 模塊中常用方法見下表。

方法名 描述
getcwd() 獲取當前工作目錄
listdir(path) 獲取指定的文件夾包含的文件或文件夾的名字的列表
rename(src,dst) 用于文件或文件夾重命名
makedirs(path) 用于遞歸創建文件夾
removedirs(path) 用于遞歸刪除文件夾
remove(path) 刪除指定路徑的文件
open(file, flags[, mode]) 打開文件
read(fd,n) 讀取指定文件
wirte(fd,str) 寫入內容
walk(dir) 文件、目錄遍歷器

os.path 模塊中常用方法見下表。

方法名 描述
os.path.exists(path) 如果路徑 path 存在,返回 True;如果路徑 path 不存在,返回 False
os.path.join(path1[, path2[, …]]) 把目錄和文件名合成一個路徑

下面來具體看下每個方法的使用:

  1. getcwd () 使用:
import os
print(os.getcwd()) #輸出:D:\code

代碼解釋:當前代碼文件存放在 D:\code 下,導入 OS 模塊,使用 getcwd () 方法,獲取當前工作目錄,打印結果為 “D:\code”,如下圖所示。

圖片描述

  1. listdir () 使用:
import os
print(os.listdir('.'))
#輸出:['dingding.py', 'image', 'index.py', 'writeppt.py', 'writeword.py']

代碼解釋:listdir () 方法可以獲取指定的文件夾包含的文件或文件夾的名字的列表,目前 D:\code 目錄下文件結構如下圖所示。

圖片描述

通過 listdir () 方法傳遞指定目錄,代碼中傳遞 “.” 表示當前目錄,輸出結果:[‘dingding.py’, ‘image’, ‘index.py’, ‘writeppt.py’, ‘writeword.py’],如下圖所示。

圖片描述

  1. rename () 使用:
import os
os.rename("image","newimage")
os.rename("dingding.py","newdingding.py")

代碼解釋 :rename () 方法為重命名文件或文件夾,第一個參數為要重命名的文件名或文件夾名,第二個參數為修改后的名稱,上述代碼中將文件夾 “image” 重名為 “newimage”,將文件 “dingding.py” 重名為 “newdingding.py”,代碼執行完成后,D:\code 目錄下效果如下圖所示。

圖片描述

  1. makedirs () 使用:
import os
os.makedirs("dist/src/code")

代碼解釋:makedirs () 方法用于遞歸創建目錄,參數即為需要遞歸創建的目錄,上述代碼指定 “dist/src/code”,即表示創建一個 dist 文件夾,其中包含 src 文件夾,在 src 下包含 code 文件夾。代碼執行完成后,D:\code 目錄下效果如下圖所示。
圖片描述

  1. removedirs () 使用:
import os
os.removedirs("dist/src/code")
print(os.listdir('.'))
#輸出:['newdingding.py', 'newimage', 'index.py', 'writeppt.py', 'writeword.py']

代碼解釋 :removedirs () 方法用于遞歸刪除目錄,參數為要遞歸刪除的目錄,上述代碼指定 “dist/src/code”,即將 dist 文件夾下 src 文件夾下 code 文件夾一并進行刪除。執行完刪除后,通過 listdir () 方法查看當前目錄下文件結構,輸出 [‘newdingding.py’, ‘newimage’, ‘index.py’, ‘writeppt.py’, ‘writeword.py’],可以看到已經完成刪除操作。代碼執行完成后,D:\code 目錄下效果如下圖所示。

圖片描述

  1. remove () 使用:
import os
os.remove("newdingding.py")
print(os.listdir('.'))
#輸出:['newimage', 'index.py', 'writeppt.py', 'writeword.py']

代碼解釋 :remove () 方法用于刪除指定文件,上述代碼中刪除 “newdingding.py” 文件,刪除完成后,通過 listdir () 方法查看當前目錄文件結構,輸出 [‘newimage’, ‘index.py’, ‘writeppt.py’, ‘writeword.py’],可以看到已經完成刪除操作。代碼執行完成后,D:\code 目錄下效果如下圖所示。

圖片描述

  1. open () 使用:
import os
os.open("writeppt.py",os.O_RDONLY)

代碼解釋:open () 方法用于打開指定文件,第一個參數為要打開的文件,第二個參數為打開的模式,可以取值如下所示:

  • OS.O_RDONLY:以只讀的方式打開;
  • OS.O_WRONLY:以只寫的方式打開;
  • OS.O_RDWR:以讀寫的方式打開;
  • OS.O_NONBLOCK:打開時不阻塞;
  • OS.O_APPEND:以追加的方式打開;
  • OS.O_CREAT:創建并打開一個新文件;
  • OS.O_TRUNC:打開一個文件并截斷它的長度為零(必須有寫權限);
  • OS.O_EXCL:如果指定的文件存在,返回錯誤;
  • OS.O_SHLOCK:自動獲取共享鎖;
  • OS.O_EXLOCK:自動獲取獨立鎖;
  • OS.O_DIRECT:消除或減少緩存效果;
  • OS.O_FSYNC:同步寫入;
  • OS.O_NOFOLLOW:不追蹤軟鏈接。

上述代碼中,打開 writeppt.py 文件,以只讀方式打開,返回新打開文件的描述符,可以進行后續的讀取、寫入操作。

  1. read () 使用:
import OS
fs=os.open("writeppt.py",OS.O_RDONLY) # fs 就是 writeppt.py 的文件描述符
print(OS.read(fs,24))

代碼解釋 :read () 方法為從文件描述符中讀取文件內容,第一個參數為 open () 方法打開文件返回的文件描述符,第二個參數為讀取的字節數。上述代碼中讀取 writeppt.py 文件 24 個字節內容。代碼執行完成后,輸出效果如下圖所示。
圖片描述

  1. write () 使用:
import os
fs=os.open("test.txt",os.O_RDWR) # fs 就是 test.txt 的文件描述符,打開模式設置為以讀寫的方式打開
print(os.write(fs,"hello python")) #寫入內容為hello python

代碼解釋:write () 方法用于寫入字符串到文件描述符 fs 中,第一個參數為文件描述符,第二個參數為寫入的字符串內容。代碼執行完成后,輸出效果如下圖所示。

圖片描述

  1. walk () 使用:
import os
for dirpath, dirnames, filenames in os.walk("D:/code"):
	#輸出:D:/code  ['newimage'] ['index.py','test.txt','writeppt.py','writeword.py']
    print(dirpath, dirnames, filenames)

代碼解釋:os.walk () 方法是一個簡單易用的文件、目錄遍歷器,接收參數為要遍歷的目錄的地址,返回的是一個三元組 (dirpath, dirnames, filenames),分別表示當前正在遍歷的這個文件夾的本身的地址、該文件夾中所有的目錄的名字、該文件夾中所有的文件。代碼中指定目錄 D:/code,執行時會遍歷 D 盤 code 目錄下所有文件和文件夾,輸出效果如下圖所示。

圖片描述

  1. os.path.exists () 使用:
import os
print(os.path.exists("D:\\code\\index.py")) #輸出true
print(os.path.exists("D:\\code\\test.py")) #輸出False

代碼解釋 :exists () 方法判斷路徑是否存在,上面代碼中在 D 盤 code 文件夾下存在 index.py,所以輸出 true,不存在 test.py,輸出 False。代碼執行完成后,輸出效果如下圖所示。

圖片描述

  1. os.path.join () 使用:
import os
#輸出D:\code\2020\11
print(os.path.join("D:\\code\\","2020\\","11"))

代碼解釋:join () 方法用于把目錄和文件名合成一個路徑。代碼執行完成后,輸出效果如下圖所示。

圖片描述

3. os 模塊實戰

在開發中,程序遇到異常情況時需要記錄錯誤日志文件,為便于程序員調試,通常錯誤日志文件的目錄結構為:當前年的文件夾下 / 當前月的文件夾下 / 當前日的文件夾 / 具體的 txt 錯誤日志文件。這時可以使用 Python 的 os 模塊封裝創建日志的公共方法,完成需求如下:

  1. 根據傳入的時間創建對應的年、月、日文件夾,在創建前需要判斷文件夾是否存在,存在則不作操作
  2. 根據傳入的內容,創建 txt 錯誤日志文件,當重復調用時,txt 錯誤日志文件內容為追加

根據上述需求背景,封裝后的代碼如下:

import os
import datetime

# 獲取到當前年
year_time = datetime.datetime.now().year
# 獲取到當前月
month_time = datetime.datetime.now().month
# 獲取到當前日
daytime = datetime.datetime.now().day

# 生成錯誤日志文件
def createError(message):
    path = os.getcwd()+"\\"+str(year_time)+"\\"+str(month_time)+"\\"+str(daytime)
    # 文件路徑是否存在
    ispath = os.path.exists(path)
    # 判斷文件是否存在:不存在創建
    if not ispath:
        os.makedirs(path)
    # 寫入異常到錯誤日志文件(log.txt)
    writeError(path, message)
# 寫入異常到錯誤日志文件
def writeError(path, message):
    fs = os.open(path+"\\log.txt", os.O_RDWR | os.O_CREAT)
    os.write(fs, message.encode('utf-8'))
# 模擬調用
createError("SQL語句異常")

代碼解釋:代碼中封裝了兩個方法分別為 createError () 方法和 writeError () 方法,用于生成錯誤日志存放文件夾及像 log.txt 寫入錯誤日志內容。年月日文件夾使用 datetime 模塊獲取當前系統的年、月、日,使用 exists () 方法判斷指定路徑是否存在,返回布爾值,存在則返回 true。

如果不存在則通過 os 模塊下的 makedirs () 方法進行創建。文件夾創建完成后,調用 writeError () 方法寫入錯誤內容,首先使用 open () 方法打開 log.txt 文件,打開模式設置為讀寫和創建,通過 write () 方法寫入錯誤內容到 log.txt。代碼執行完成后,輸出效果如下圖所示:

圖片描述

圖片描述

4. 小結

本節課程我們主要學習了 os 模塊的使用。本節課程的重點如下:

  • 了解 os 模塊作用及使用步驟;
  • 掌握 os 模塊中操作文件與文件夾的使用方法。

圖片描述