Python使用os模塊操作文件與目錄的完整指南
一、os 模塊是什么
os 模塊是Python標準庫的一部分,無需額外安裝即可使用。它封裝了不同操作系統(tǒng)(Windows、Linux、MacOS等)的底層系統(tǒng)調(diào)用,提供了一致的接口使用,它可以讓我們在Python中執(zhí)行各種操作系統(tǒng)級別的任務(wù),如創(chuàng)建/刪除目錄、遍歷文件系統(tǒng)、管理文件路徑等。
二、路徑操作
1. 獲取當前工作目錄
需求場景:
- 需要知道腳本當前運行的位置
- 需要基于當前目錄構(gòu)建相對路徑
- 調(diào)試時確認程序的工作目錄是否正確
os.getcwd() 返回的是字符串形式的絕對路徑。
import os
current_dir = os.getcwd()
print(f"當前工作目錄: {current_dir}")
2. 改變工作目錄
需求場景:
- 需要切換到特定目錄進行操作
- 處理相對路徑前確保在正確的目錄下
- 臨時切換到某個目錄處理文件后又需要返回原目錄
os.chdir() 會改變當前進程的工作目錄。如果目標目錄不存在會拋出 FileNotFoundError
os.chdir('/path/to/new/directory')
print(f"新工作目錄: {os.getcwd()}")
3. 路徑拼接
需求場景:
- 構(gòu)建跨平臺的路徑時(Windows用\,Linux和Mac用/)
- 動態(tài)組合路徑各部分
- 避免手動拼接路徑導致的錯誤
使用 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. 路徑分解與提取
需求場景:
- 需要單獨獲取文件名或目錄名
- 批量處理文件擴展名
- 分析用戶提供的文件路徑
os.path.dirname() 和 os.path.basename() 是互補的操作。os.path.splitext()只會分離最后一個擴展名,對于多重擴展名(如".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
# 分割文件擴展名
name, ext = os.path.splitext(base_name)
print(f"文件名: {name}, 擴展名: {ext}") # 文件名: report, 擴展名: .txt
5. 路徑有效性檢查
需求場景:
- 處理輸入路徑前驗證有效性
- 確保文件/目錄存在再進行操作
- 編寫安裝腳本時需要檢查目標位置
這些檢查函數(shù)不會拋出異常,而是返回布爾值。對于符號鏈接,os.path.isfile() 和 os.path.isdir()會跟隨鏈接檢查目標文件/目錄。
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)
- 上傳文件前確保目標目錄存在
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')
# 刪除目錄樹 (謹慎使用!)
import shutil
shutil.rmtree('directory_with_contents')
3. 遍歷目錄
需求場景:
- 批量處理目錄中的文件
- 實現(xiàn)文件搜索功能
- 統(tǒng)計目錄內(nèi)容
- 備份目錄結(jié)構(gòu)
os.listdir() 只返回指定目錄的直接內(nèi)容,不包含子目錄內(nèi)容。os.walk() 是生成器函數(shù),會遞歸遍歷所有子目錄,返回三元組(當前目錄路徑,子目錄列表,文件列表)??梢酝ㄟ^修改 dirs 列表來控制遍歷過程。
# 列出目錄內(nèi)容
print("當前目錄內(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"當前目錄: {root}")
print(f"子目錄: {dirs}")
print(f"文件: {files}")
print("-" * 40)
四、文件操作
1. 文件重命名
需求場景:
- 批量重命名文件
- 添加時間戳到文件名
os.rename() 也可以用于移動文件(如果在不同目錄下)。如果目標文件已存在,在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. 刪除文件
需求場景:
- 清理臨時文件
- 實現(xiàn)文件刪除功能
- 定期清理舊文件
os.remove() 只能刪除文件,不能刪除目錄。刪除前最好檢查文件是否存在和是否有權(quán)限刪除。
os.remove('file_to_delete.txt')
# 刪除一周前的臨時文件(基于文件修改時間進行選擇性刪除)
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. 獲取文件信息
需求場景:
- 顯示文件詳細信息
- 按大小/時間篩選文件
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)境變量只在當前進程及其子進程中有效,不會影響系統(tǒng)環(huán)境變量。os.getenv() 比直接訪問 os.environ 更安全,因為當變量不存在時可以指定默認值。
# 獲取環(huán)境變量
home_dir = os.getenv('HOME') # 或 os.environ.get('HOME')
print(f"用戶主目錄: {home_dir}")
# 設(shè)置環(huán)境變量(僅當前進程有效)
os.environ['MY_VAR'] = 'some_value'
print(f"MY_VAR: {os.getenv('MY_VAR')}")
六、跨平臺路徑處理
需求場景:
- 編寫需要在多個操作系統(tǒng)運行的腳本
- 處理用戶提供的不同格式的路徑
- 確保路徑比較的正確性
os.path 模塊提供了跨平臺的路徑處理方法,os.path.normpath() 會解析路徑中的 . 和 …,并標準化路徑分隔符。os.path.abspath() 會將路徑轉(zhuǎn)換為絕對路徑,基于當前工作目錄。os.path.commonpath()比 os.path.commonprefix() 更準確,因為它會考慮路徑分隔符。
path = "/home/user/docs/file.txt"
print(f"路徑分隔符: {os.path.sep}") # Linux: /, Windows: \
print(f"路徑標準化: {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
七、實用示例
示例1:批量重命名文件
需求場景:
- 整理照片庫(添加日期/地點前綴)
- 標準化下載的文件名
- 批量修改項目中的資源文件名
示例展示了如何批量修改文件名。在實際應(yīng)用中,可以擴展為更復(fù)雜的重命名規(guī)則,如添加序號、修改擴展名、根據(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:查找特定擴展名的文件
需求場景:
- 收集所有日志文件(.log)進行分析
- 查找項目中的所有圖片資源(.jpg,.png)
- 統(tǒng)計源代碼文件數(shù)量(.py等)
使用 os.walk() 遞歸搜索目錄。file.endswith() 是大小寫敏感的,如果需要不區(qū)分大小寫,可以改為 file.lower().endswith(extension.lower())
def find_files_by_extension(directory, extension):
"""遞歸查找目錄中特定擴展名的文件"""
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:計算目錄大小
需求場景:
- 實現(xiàn)磁盤空間檢查功能
- 限制用戶上傳目錄的大小
- 分析項目各模塊占用空間
這個函數(shù)計算的是目錄中所有文件的實際大小總和,不包括目錄元數(shù)據(jù)占用的空間。跳過了符號鏈接以避免重復(fù)計算或無限遞歸。對于非常大的目錄,可能需要優(yōu)化性能。
def get_directory_size(directory):
"""計算目錄總大小(字節(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)")
八、安全注意事項
- 使用
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)境變量
- 編寫跨平臺的腳本
在實際開發(fā)中,可以根據(jù)具體需求選擇合適的函數(shù),并注意異常處理和跨平臺兼容性。
以上就是Python使用os模塊操作文件與目錄的完整指南的詳細內(nèi)容,更多關(guān)于Python os模塊操作文件與目錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
selenium+python配置chrome瀏覽器的選項的實現(xiàn)
這篇文章主要介紹了selenium+python配置chrome瀏覽器的選項的實現(xiàn)。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
Python異步爬蟲實現(xiàn)原理與知識總結(jié)
之前有很多小伙伴想看Python異步爬蟲的有關(guān)知識總結(jié),這次它來了,文中有非常詳細的代碼示例與注釋,即使對剛開始學python的小伙伴也很友好,,需要的朋友可以參考下2021-05-05
python?requests實現(xiàn)上傳excel數(shù)據(jù)流
這篇文章主要介紹了python?requests實現(xiàn)上傳excel數(shù)據(jù)流,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
python簡易實現(xiàn)任意位數(shù)的水仙花實例
今天小編就為大家分享一篇python簡易實現(xiàn)任意位數(shù)的水仙花實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
解決tensorflow讀取本地MNITS_data失敗的原因
這篇文章主要介紹了解決tensorflow讀取本地MNITS_data失敗的原因,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

