Python使用os模塊操作文件與目錄的完整指南
一、os 模塊是什么
os 模塊是Python標(biāo)準(zhǔn)庫的一部分,無需額外安裝即可使用。它封裝了不同操作系統(tǒng)(Windows、Linux、MacOS等)的底層系統(tǒng)調(diào)用,提供了一致的接口使用,它可以讓我們在Python中執(zhí)行各種操作系統(tǒng)級別的任務(wù),如創(chuàng)建/刪除目錄、遍歷文件系統(tǒng)、管理文件路徑等。
二、路徑操作
1. 獲取當(dāng)前工作目錄
需求場景:
- 需要知道腳本當(dāng)前運(yùn)行的位置
- 需要基于當(dāng)前目錄構(gòu)建相對路徑
- 調(diào)試時確認(rèn)程序的工作目錄是否正確
os.getcwd() 返回的是字符串形式的絕對路徑。
import os
current_dir = os.getcwd()
print(f"當(dāng)前工作目錄: {current_dir}")
2. 改變工作目錄
需求場景:
- 需要切換到特定目錄進(jìn)行操作
- 處理相對路徑前確保在正確的目錄下
- 臨時切換到某個目錄處理文件后又需要返回原目錄
os.chdir() 會改變當(dāng)前進(jìn)程的工作目錄。如果目標(biāo)目錄不存在會拋出 FileNotFoundError
os.chdir('/path/to/new/directory')
print(f"新工作目錄: {os.getcwd()}")
3. 路徑拼接
需求場景:
- 構(gòu)建跨平臺的路徑時(Windows用\,Linux和Mac用/)
- 動態(tài)組合路徑各部分
- 避免手動拼接路徑導(dǎo)致的錯誤
使用 os.path.join() 可以安全地拼接路徑,它會自動處理不同操作系統(tǒng)的路徑分隔符。
path = os.path.join('folder', 'subfolder', 'file.txt')
print(f"拼接后的路徑: {path}")
# 在Windows上輸出: folder\subfolder\file.txt
# 在Linux/Mac上輸出: folder/subfolder/file.txt
4. 路徑分解與提取
需求場景:
- 需要單獨(dú)獲取文件名或目錄名
- 批量處理文件擴(kuò)展名
- 分析用戶提供的文件路徑
os.path.dirname() 和 os.path.basename() 是互補(bǔ)的操作。os.path.splitext()只會分離最后一個擴(kuò)展名,對于多重擴(kuò)展名(如".tar.gz")需要特別注意。
file_path = "/home/user/documents/report.txt"
# 獲取路徑的目錄部分
dir_name = os.path.dirname(file_path)
print(f"目錄部分: {dir_name}") # /home/user/documents
# 獲取文件名部分
base_name = os.path.basename(file_path)
print(f"文件名部分: {base_name}") # report.txt
# 分割文件擴(kuò)展名
name, ext = os.path.splitext(base_name)
print(f"文件名: {name}, 擴(kuò)展名: {ext}") # 文件名: report, 擴(kuò)展名: .txt
5. 路徑有效性檢查
需求場景:
- 處理輸入路徑前驗(yàn)證有效性
- 確保文件/目錄存在再進(jìn)行操作
- 編寫安裝腳本時需要檢查目標(biāo)位置
這些檢查函數(shù)不會拋出異常,而是返回布爾值。對于符號鏈接,os.path.isfile() 和 os.path.isdir()會跟隨鏈接檢查目標(biāo)文件/目錄。
path = "/some/path/to/file.txt"
print(f"路徑是否存在: {os.path.exists(path)}")
print(f"是否是文件: {os.path.isfile(path)}")
print(f"是否是目錄: {os.path.isdir(path)}")
print(f"是否是絕對路徑: {os.path.isabs(path)}")
三、目錄操作
1. 創(chuàng)建目錄
需求場景:
- 程序需要生成輸出目錄
- 安裝程序創(chuàng)建必要的目錄結(jié)構(gòu)
- 上傳文件前確保目標(biāo)目錄存在
os.mkdir() 只能創(chuàng)建單級目錄,如果父目錄不存在會拋出 FileNotFoundError。而 os.makedirs()可以遞歸創(chuàng)建多級目錄,exist_ok=True 參數(shù)使得目錄已存在時不會報錯。
# 創(chuàng)建單個目錄
os.mkdir('new_directory')
# 創(chuàng)建多級目錄
os.makedirs('parent/child/grandchild', exist_ok=True) # exist_ok=True 避免目錄已存在時報錯
2. 刪除目錄
需求場景:
- 清理臨時目錄
- 卸載程序刪除相關(guān)目錄
- 定期清理舊數(shù)據(jù)
os.rmdir()只能刪除空目錄,否則會拋出 OSError。要刪除非空目錄需要使用 shutil.rmtree(),它會遞歸刪除整個目錄樹,使用時需特別小心。
# 刪除空目錄
os.rmdir('empty_directory')
# 刪除目錄樹 (謹(jǐn)慎使用!)
import shutil
shutil.rmtree('directory_with_contents')
3. 遍歷目錄
需求場景:
- 批量處理目錄中的文件
- 實(shí)現(xiàn)文件搜索功能
- 統(tǒng)計(jì)目錄內(nèi)容
- 備份目錄結(jié)構(gòu)
os.listdir() 只返回指定目錄的直接內(nèi)容,不包含子目錄內(nèi)容。os.walk() 是生成器函數(shù),會遞歸遍歷所有子目錄,返回三元組(當(dāng)前目錄路徑,子目錄列表,文件列表)??梢酝ㄟ^修改 dirs 列表來控制遍歷過程。
# 列出目錄內(nèi)容
print("當(dāng)前目錄內(nèi)容:")
for item in os.listdir('.'):
print(item)
# 使用os.walk遞歸遍歷目錄
print("\n遞歸遍歷目錄結(jié)構(gòu):")
for root, dirs, files in os.walk('.'):
print(f"當(dāng)前目錄: {root}")
print(f"子目錄: {dirs}")
print(f"文件: {files}")
print("-" * 40)
四、文件操作
1. 文件重命名
需求場景:
- 批量重命名文件
- 添加時間戳到文件名
os.rename() 也可以用于移動文件(如果在不同目錄下)。如果目標(biāo)文件已存在,在Windows上會拋出 FileExistsError,在Unix系統(tǒng)上會靜默覆蓋。
os.rename('old_name.txt', 'new_name.txt')
# 為日志文件添加日期前綴
log_file = "app.log"
today = datetime.now().strftime("%Y%m%d")
new_name = f"{today}_{log_file}"
os.rename(log_file, new_name)
2. 刪除文件
需求場景:
- 清理臨時文件
- 實(shí)現(xiàn)文件刪除功能
- 定期清理舊文件
os.remove() 只能刪除文件,不能刪除目錄。刪除前最好檢查文件是否存在和是否有權(quán)限刪除。
os.remove('file_to_delete.txt')
# 刪除一周前的臨時文件(基于文件修改時間進(jìn)行選擇性刪除)
for file in os.listdir('temp'):
file_path = os.path.join('temp', file)
if os.path.isfile(file_path):
file_age = time.time() - os.path.getmtime(file_path)
if file_age > 7 * 24 * 3600: # 7天
os.remove(file_path)
3. 獲取文件信息
需求場景:
- 顯示文件詳細(xì)信息
- 按大小/時間篩選文件
os.stat() 返回的 st_mtime 和 st_ctime 是時間戳(秒數(shù)),可以使用 datetime.fromtimestamp() 轉(zhuǎn)換為可讀格式。
file_stat = os.stat('some_file.txt')
print(f"文件大小: {file_stat.st_size} 字節(jié)")
print(f"最后修改時間: {file_stat.st_mtime}")
print(f"創(chuàng)建時間: {file_stat.st_ctime}")
五、環(huán)境變量操作
需求場景:
- 讀取系統(tǒng)配置
- 根據(jù)環(huán)境改變程序行為(開發(fā)/生產(chǎn)環(huán)境)
- 安全存儲敏感信息(如API密鑰)
通過 os.environ 設(shè)置的環(huán)境變量只在當(dāng)前進(jìn)程及其子進(jìn)程中有效,不會影響系統(tǒng)環(huán)境變量。os.getenv() 比直接訪問 os.environ 更安全,因?yàn)楫?dāng)變量不存在時可以指定默認(rèn)值。
# 獲取環(huán)境變量
home_dir = os.getenv('HOME') # 或 os.environ.get('HOME')
print(f"用戶主目錄: {home_dir}")
# 設(shè)置環(huán)境變量(僅當(dāng)前進(jìn)程有效)
os.environ['MY_VAR'] = 'some_value'
print(f"MY_VAR: {os.getenv('MY_VAR')}")
六、跨平臺路徑處理
需求場景:
- 編寫需要在多個操作系統(tǒng)運(yùn)行的腳本
- 處理用戶提供的不同格式的路徑
- 確保路徑比較的正確性
os.path 模塊提供了跨平臺的路徑處理方法,os.path.normpath() 會解析路徑中的 . 和 …,并標(biāo)準(zhǔn)化路徑分隔符。os.path.abspath() 會將路徑轉(zhuǎn)換為絕對路徑,基于當(dāng)前工作目錄。os.path.commonpath()比 os.path.commonprefix() 更準(zhǔn)確,因?yàn)樗鼤紤]路徑分隔符。
path = "/home/user/docs/file.txt"
print(f"路徑分隔符: {os.path.sep}") # Linux: /, Windows: \
print(f"路徑標(biāo)準(zhǔn)化: {os.path.normpath('docs/../docs/file.txt')}")
print(f"絕對路徑: {os.path.abspath('file.txt')}")
print(f"共同前綴: {os.path.commonprefix(['/usr/lib', '/usr/local/lib'])}") # /usr/l
print(f"共同路徑: {os.path.commonpath(['/usr/lib', '/usr/local/lib'])}") # /usr
七、實(shí)用示例
示例1:批量重命名文件
需求場景:
- 整理照片庫(添加日期/地點(diǎn)前綴)
- 標(biāo)準(zhǔn)化下載的文件名
- 批量修改項(xiàng)目中的資源文件名
示例展示了如何批量修改文件名。在實(shí)際應(yīng)用中,可以擴(kuò)展為更復(fù)雜的重命名規(guī)則,如添加序號、修改擴(kuò)展名、根據(jù)文件內(nèi)容重命名等。
def batch_rename(directory, prefix):
"""為目錄中的所有文件添加前綴"""
for filename in os.listdir(directory):
if os.path.isfile(os.path.join(directory, filename)):
new_name = prefix + filename
os.rename(
os.path.join(directory, filename),
os.path.join(directory, new_name)
)
print(f"重命名: {filename} -> {new_name}")
# 使用示例
batch_rename('./photos', 'vacation_')
示例2:查找特定擴(kuò)展名的文件
需求場景:
- 收集所有日志文件(.log)進(jìn)行分析
- 查找項(xiàng)目中的所有圖片資源(.jpg,.png)
- 統(tǒng)計(jì)源代碼文件數(shù)量(.py等)
使用 os.walk() 遞歸搜索目錄。file.endswith() 是大小寫敏感的,如果需要不區(qū)分大小寫,可以改為 file.lower().endswith(extension.lower())
def find_files_by_extension(directory, extension):
"""遞歸查找目錄中特定擴(kuò)展名的文件"""
matches = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(extension):
matches.append(os.path.join(root, file))
return matches
# 使用示例
py_files = find_files_by_extension('.', '.py')
print("找到的Python文件:")
for file in py_files:
print(file)
示例3:計(jì)算目錄大小
需求場景:
- 實(shí)現(xiàn)磁盤空間檢查功能
- 限制用戶上傳目錄的大小
- 分析項(xiàng)目各模塊占用空間
這個函數(shù)計(jì)算的是目錄中所有文件的實(shí)際大小總和,不包括目錄元數(shù)據(jù)占用的空間。跳過了符號鏈接以避免重復(fù)計(jì)算或無限遞歸。對于非常大的目錄,可能需要優(yōu)化性能。
def get_directory_size(directory):
"""計(jì)算目錄總大小(字節(jié))"""
total = 0
for dirpath, dirnames, filenames in os.walk(directory):
for f in filenames:
fp = os.path.join(dirpath, f)
# 跳過符號鏈接
if not os.path.islink(fp):
total += os.path.getsize(fp)
return total
# 使用示例
size = get_directory_size('./')
print(f"目錄總大小: {size} 字節(jié) ({size/1024/1024:.2f} MB)")
八、安全注意事項(xiàng)
- 使用
os.path而不是手動拼接路徑,確??缙脚_兼容性 - 執(zhí)行刪除操作前先檢查路徑是否存在
- 處理用戶提供的路徑時要小心,防止目錄遍歷攻擊
- 考慮使用
try-except處理可能的異常
文件操作可能引發(fā)多種異常,如權(quán)限不足、文件不存在、路徑無效等。對于關(guān)鍵操作,建議先檢查再執(zhí)行,并做好異常處理。
try:
os.remove('important_file.txt')
except FileNotFoundError:
print("文件不存在,無需刪除")
except PermissionError:
print("沒有刪除文件的權(quán)限")
九、總結(jié)
掌握Python 的 os 模塊,為操作文件和目錄提供更多便利:
- 安全地處理各種路徑操作
- 創(chuàng)建、刪除和遍歷目錄結(jié)構(gòu)
- 管理文件和獲取文件信息
- 訪問和修改環(huán)境變量
- 編寫跨平臺的腳本
在實(shí)際開發(fā)中,可以根據(jù)具體需求選擇合適的函數(shù),并注意異常處理和跨平臺兼容性。
以上就是Python使用os模塊操作文件與目錄的完整指南的詳細(xì)內(nèi)容,更多關(guān)于Python os模塊操作文件與目錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
selenium+python配置chrome瀏覽器的選項(xiàng)的實(shí)現(xiàn)
這篇文章主要介紹了selenium+python配置chrome瀏覽器的選項(xiàng)的實(shí)現(xiàn)。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Python異步爬蟲實(shí)現(xiàn)原理與知識總結(jié)
之前有很多小伙伴想看Python異步爬蟲的有關(guān)知識總結(jié),這次它來了,文中有非常詳細(xì)的代碼示例與注釋,即使對剛開始學(xué)python的小伙伴也很友好,,需要的朋友可以參考下2021-05-05
python?requests實(shí)現(xiàn)上傳excel數(shù)據(jù)流
這篇文章主要介紹了python?requests實(shí)現(xiàn)上傳excel數(shù)據(jù)流,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Pycharm遠(yuǎn)程調(diào)試原理及具體配置詳解
這篇文章主要介紹了Pycharm遠(yuǎn)程調(diào)試原理及具體配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
使用Python實(shí)現(xiàn)分別輸出每個數(shù)組
今天小編就為大家分享一篇使用Python實(shí)現(xiàn)分別輸出每個數(shù)組,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python簡易實(shí)現(xiàn)任意位數(shù)的水仙花實(shí)例
今天小編就為大家分享一篇python簡易實(shí)現(xiàn)任意位數(shù)的水仙花實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
解決tensorflow讀取本地MNITS_data失敗的原因
這篇文章主要介紹了解決tensorflow讀取本地MNITS_data失敗的原因,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

