攝影或3C

Python 路徑管理指南:告別又臭又長的 os.path 焦慮; from pathlib import Path; ROOT = Path(__file__).resolve().parent

對於許多剛從 Node.js 轉過來,或是習慣寫腳本語言的開發者來說,Python 中最令人煩躁的一行程式碼莫過於此:

# 為了拿到當前檔案的資料夾路徑你需要唸一段咒語
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

這行程式碼雖然經典,但確實太長、太囉唆,而且括號多到容易看花眼。如果你覺得這行程式碼很礙眼,但又覺得 pathlib 的物件導向寫法有點陌生,這篇文章將帶你探討幾種讓這段程式碼「變好用」的策略。

策略一:封裝它(The “Utility” Approach)

如果你不想改變使用 os.path 的習慣,最簡單的方法就是眼不見為淨。不要在每個檔案裡都寫那行長長的咒語,而是把它藏在專案的一個角落。

通常我們會建立一個 settings.pyconfig.py

# settings.py
import os

# 在這裡寫一次痛苦一次就好
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# 定義一些輔助函數讓其他地方調用更簡單
def get_path(*args):
    return os.path.join(BASE_DIR, *args)

在其他檔案使用時:

from settings import get_path

# 瞬間清爽
data_path = get_path('data', 'users.csv')
template_path = get_path('templates', 'index.html')

優點:

  • 保留了你熟悉的 os.path 邏輯。
  • 程式碼語意變得很清晰(get_pathos.path.join 好讀)。
  • 專案結構變動時,只需要改 settings.py 一個地方。

策略二:擁抱 sys.path 的黑魔法(進階)

有時候我們寫那行長路徑是為了 import 同層級或上層級的模組。如果你是為了這個目的,可以考慮直接操作 sys.path,雖然這被視為一種 Hack,但在寫臨時腳本時非常快。

import sys
import os

# 將當前目錄加入 Python 搜尋路徑
sys.path.append(os.getcwd())

注意:這不是獲取 __dirname__,而是讓 Python 能夠「看見」當前目錄下的其他檔案。這在某些快速開發場景下可以省去處理路徑的麻煩,但不建議在大型專案使用。

策略三:給 pathlib 一次機會(真的,它值得)

我知道你說 os.path 比較熟悉,但請容許我用30秒展示為什麼 pathlib 能解決你覺得「太長」的問題。

os.path字串處理思維(字串拼接、切割),而 pathlib物件思維。

比較一下:

任務:找到隔壁 data 資料夾裡的 config.json

❌ 舊愛 os.path (字串拼接):

import os
root = os.path.dirname(os.path.abspath(__file__))
config_path = os.path.join(root, 'data', 'config.json')
# 寫起來很長而且要一直用 os.path.join

✅ 新歡 pathlib (運算子重載):

from pathlib import Path

# 這裡雖然看起來差不多長但重點在下一行
# 1. Path(__file__): 鎖定目前這個 Python 腳本檔案
# 2. .resolve(): 將路徑轉為絕對路徑」,消除相對路徑或捷徑造成的不確定性
# 3. .parent: 去掉檔名取得該檔案所在的資料夾路徑
ROOT = Path(__file__).resolve().parent 

# 看這個用除法符號 '/' 連接路徑這才是人類直覺
config_path = ROOT / 'data' / 'config.json'

你沒看錯,就是斜線 /。Python 3.4+ 允許路徑物件直接用除法符號來拼接。這徹底消滅了 os.path.join() 這個冗長的函數。

總結:該選哪一種?

  1. 如果你在維護舊專案,或者團隊強制要求相容極舊的 Python 版本:請使用 策略一,將那行長長的 os.path 封裝在全域設定檔中。
  2. 如果你只是覺得打字很累,但願意嘗試新事物:強烈建議試試 策略三。只要習慣了 path / 'folder' / 'file' 這種寫法,你就再也回不去 os.path.join 了。

程式碼的長度不是問題,可讀性才是。選擇讓你和你的隊友讀起來最舒服的那一種吧!

推薦hahow線上學習python: https://igrape.net/30afN

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡