對於許多剛從 Node.js 轉過來,或是習慣寫腳本語言的開發者來說,Python 中最令人煩躁的一行程式碼莫過於此:
# 為了拿到當前檔案的資料夾路徑,你需要唸一段咒語:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))這行程式碼雖然經典,但確實太長、太囉唆,而且括號多到容易看花眼。如果你覺得這行程式碼很礙眼,但又覺得 pathlib 的物件導向寫法有點陌生,這篇文章將帶你探討幾種讓這段程式碼「變好用」的策略。
策略一:封裝它(The “Utility” Approach)
如果你不想改變使用 os.path 的習慣,最簡單的方法就是眼不見為淨。不要在每個檔案裡都寫那行長長的咒語,而是把它藏在專案的一個角落。
通常我們會建立一個 settings.py 或 config.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_path比os.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() 這個冗長的函數。
總結:該選哪一種?
- 如果你在維護舊專案,或者團隊強制要求相容極舊的 Python 版本:請使用 策略一,將那行長長的
os.path封裝在全域設定檔中。 - 如果你只是覺得打字很累,但願意嘗試新事物:強烈建議試試 策略三。只要習慣了
path / 'folder' / 'file'這種寫法,你就再也回不去os.path.join了。
程式碼的長度不是問題,可讀性才是。選擇讓你和你的隊友讀起來最舒服的那一種吧!
推薦hahow線上學習python: https://igrape.net/30afN



![Python爬蟲:BeautifulSoup的 .find_all() 與 .find() 與 .select(‘標籤名[屬性名1=”屬性值1″][屬性名2=”屬性值2″]’) ; from bs4 import BeautifulSoup ; Live Server(可以預覽HTML的VS Code套件) Python爬蟲:BeautifulSoup的 .find_all() 與 .find() 與 .select(‘標籤名[屬性名1=”屬性值1″][屬性名2=”屬性值2″]’) ; from bs4 import BeautifulSoup ; Live Server(可以預覽HTML的VS Code套件)](https://i1.wp.com/savingking.com.tw/wp-content/uploads/2025/03/20250330190318_0_925655.jpg?quality=90&zoom=2&ssl=1&resize=350%2C233)



![Python Logging 完全指南:從基礎到實戰應用; import logging ; logging.basicConfig(level=logging.INFO, handlers=[ logging.StreamHandler(), logging.FileHandler(‘app.log’, mode=’a’, encoding=’utf-8′)] ) ; inspect.currentframe().f_code.co_name #動態取得funcName Python Logging 完全指南:從基礎到實戰應用; import logging ; logging.basicConfig(level=logging.INFO, handlers=[ logging.StreamHandler(), logging.FileHandler(‘app.log’, mode=’a’, encoding=’utf-8′)] ) ; inspect.currentframe().f_code.co_name #動態取得funcName](https://i1.wp.com/savingking.com.tw/wp-content/uploads/2025/10/20251021155823_0_c16012.png?quality=90&zoom=2&ssl=1&resize=350%2C233)


近期留言