Python路徑教學:os.path與pathlib完整解析,從絕對路徑到PYTHONPATH活用法

1. Python Path的概述與重要性

Python檔案路徑管理的基礎

在Python中,「路徑」是用來指定檔案或資料夾位置的指引,在電腦檔案系統中扮演著關鍵角色。例如,當你要開啟某個目錄內的檔案,或在程式中操作檔案時,如果路徑設定錯誤就會發生錯誤。因此,理解路徑的用法是程式設計的基本技能之一。

Python 提供多個模組用於處理檔案路徑,其中最常用的就是 os.pathpathlib 模組。正確運用這些模組,可以有效率地操作檔案,同時確保跨作業系統(如Windows、Linux、macOS)的兼容性。

絕對路徑與相對路徑

路徑主要分為「絕對路徑」與「相對路徑」兩種。

  • 絕對路徑是指從系統根目錄出發的完整路徑,無論從哪個目錄執行都能找到正確的檔案或資料夾。例如,在 Windows 下會像 C:\Users\YourName\Documents\file.txt 這樣指定。
  • 相對路徑則是以目前的工作目錄(Current Directory)為基準的相對位置。例如,若目前目錄是 C:\Users\YourName,那麼以相對路徑 Documents\file.txt 也能存取相同檔案。

Python 路徑管理的重要性

在 Python 中操作檔案時,正確處理不同平台間的路徑差異非常重要。例如,Windows 使用「\」做為路徑分隔符,Linux 與 macOS 則使用「/」。os.pathpathlib 模組能協助你無需擔心這些差異,輕鬆撰寫能跨平台運作的程式。

2. 基本Path操作:os.path模組

什麼是 os.path 模組

os.path 模組是 Python 標準函式庫的一部分,提供多種方便的功能來操作檔案或目錄的路徑。它包含了檢查檔案是否存在、結合路徑、取得檔名等日常路徑操作的基本工具。此外,它也能自動處理不同作業系統之間的分隔符差異,支援跨平台開發。

主要函式介紹

使用 os.path.exists() 檢查檔案或資料夾是否存在

os.path.exists() 用來檢查指定路徑是否存在。若存在,回傳 True,否則回傳 False。範例如下:

import os

path = "/path/to/file.txt"

if os.path.exists(path):
    print("檔案存在。")
else:
    print("檔案不存在。")

使用 os.path.join() 合併路徑

os.path.join() 用來正確結合多個路徑。這個方法會根據作業系統自動處理分隔符,省去手動拼接字串的麻煩。例如:

import os

dir_path = "/path/to/directory"
file_name = "file.txt"

full_path = os.path.join(dir_path, file_name)
print(full_path)  # /path/to/directory/file.txt

使用 os.path.basename() 和 os.path.dirname() 取得檔名與目錄名

os.path.basename() 可從路徑中取得檔名,os.path.dirname() 則可取得目錄名稱。例如:

import os

path = "/path/to/directory/file.txt"

file_name = os.path.basename(path)
dir_name = os.path.dirname(path)

print(file_name)  # file.txt
print(dir_name)   # /path/to/directory

os.path 模組範例

以下展示如何用 os.path 模組進行檔案存在性檢查、路徑結合、取得檔名與目錄名等常用操作。

import os

# 合併路徑
base_dir = "/user/local"
file_name = "example.txt"
full_path = os.path.join(base_dir, file_name)

# 檢查檔案是否存在
if os.path.exists(full_path):
    print(f"{full_path} 存在。")
else:
    print(f"{full_path} 不存在。")

# 取得檔名與目錄名
print("檔名:", os.path.basename(full_path))
print("目錄名:", os.path.dirname(full_path))

 

年収訴求

3. 進階Path操作:pathlib模組

pathlib模組概述

pathlib 模組自 Python 3.4 起引入,是一個用物件導向方式操作檔案系統路徑的模組。過去 os.path 以字串處理路徑,pathlib 則將路徑視為物件,讓你可以更直覺地進行各種操作,使 Python 程式碼更易讀也更容易維護。

pathlib 基本用法

建立與合併路徑

pathlib 中,路徑以 Path 物件來處理。建立路徑非常簡單:

from pathlib import Path

# 建立路徑
path = Path("/user/local/example.txt")
print(path)

合併路徑時可以直接使用 / 運算子,這比 os.path.join() 更直觀:

from pathlib import Path

# 合併路徑
base_dir = Path("/user/local")
file_name = "example.txt"
full_path = base_dir / file_name
print(full_path)  # /user/local/example.txt

檔案與目錄存在性檢查

pathlib 提供 exists() 方法來確認路徑是否存在,類似於 os.path.exists(),並且可以用 is_file()is_dir() 進一步判斷是檔案還是資料夾。

from pathlib import Path

path = Path("/user/local/example.txt")

if path.exists():
    print("檔案或資料夾存在。")

if path.is_file():
    print("這是一個檔案。")

if path.is_dir():
    print("這是一個資料夾。")

操作絕對路徑與相對路徑

pathlib 讓你輕鬆處理絕對路徑與相對路徑。例如,使用 resolve() 可以將相對路徑轉成絕對路徑:

from pathlib import Path

relative_path = Path("example.txt")
absolute_path = relative_path.resolve()
print(absolute_path)  # /full/path/to/example.txt

要將絕對路徑轉成相對路徑,則使用 relative_to()

from pathlib import Path

absolute_path = Path("/user/local/example.txt")
relative_path = absolute_path.relative_to("/user")
print(relative_path)  # local/example.txt

pathlib 的優勢

pathlib 最大優勢在於其物件導向設計,讓程式更直覺易懂,也無需記憶太多函式。此外,pathlib 提供更完整的跨平台支援,在多種作業系統間進行檔案處理都更方便。

4. 環境變數 PYTHONPATH 的活用

什麼是 PYTHONPATH?

PYTHONPATH 是 Python 搜尋模組與套件時使用的環境變數。通常 Python 會依據 sys.path 查找標準函式庫及已安裝的套件,但透過設定 PYTHONPATH,你可以讓 Python 優先搜尋指定目錄。這在不同專案或要載入自訂模組時特別方便。

PYTHONPATH 的設定方法

在命令列暫時設定

要在命令列暫時設定 PYTHONPATH,可以如下操作。指定目錄後再執行 Python 程式即可。

  • Linux/macOS:
export PYTHONPATH=/path/to/directory:$PYTHONPATH
python script.py
  • Windows:
set PYTHONPATH=C:\pathtodirectory;%PYTHONPATH%
python script.py

這種方法適合暫時用途,關閉終端機後設定會失效。

永久設定方法

要讓 PYTHONPATH 永久生效,可以加到 shell 設定檔中。

  • Linux/macOS:
    將下列內容加到 .bashrc.zshrc 設定檔:
  export PYTHONPATH=/path/to/directory:$PYTHONPATH
  • Windows:
    可在「系統屬性」→「環境變數」→「使用者環境變數」裡新增 PYTHONPATH 並設定目錄路徑。

這樣每次開啟終端機時 PYTHONPATH 就會自動設定。

PYTHONPATH 的實用範例

假設你的專案有多個目錄都要被 Python 載入,可用 PYTHONPATH 一次設定多個目錄。例如:

/my_project/
│
├── /src/
│   └── my_module.py
│
└── /lib/
    └── my_library.py

要同時載入 srclib,可將它們加入 PYTHONPATH

export PYTHONPATH=/my_project/src:/my_project/lib

之後就能同時 import 兩個模組:

from my_module import my_function
from my_library import my_library_function

注意事項與最佳實踐

設定 PYTHONPATH 時要注意避免重複目錄,否則有可能 import 到非預期的模組。可先檢查目前設定:

echo $PYTHONPATH

此外,建議開發環境才用 PYTHONPATH,正式運作時建議使用虛擬環境(如 Virtualenv 或 venv),以便獨立管理不同專案間的依賴。

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. os.path 與 pathlib 的選用

os.path 與 pathlib 的差異

Python 有 os.pathpathlib 兩個主要的檔案路徑操作模組,各有優勢,適用情境也略有不同。

os.path 的特點

os.path 是 Python 2.x 就已經存在的經典模組,所有路徑都以字串處理,常用於函式型操作。特點如下:

  • 輕巧易用os.path 用法非常簡單,適合小型專案。
  • 跨平台支援:支援 Windows、Linux、macOS 等多作業系統。
  • 字串操作:所有路徑皆以字串處理,大型專案時程式碼會較繁雜。

pathlib 的特點

pathlib 則是 Python 3.4 以後的新模組,以物件導向處理路徑。特點如下:

  • 物件導向:可直接用方法鏈式操作,程式碼更易懂。
  • 直覺運算子:用 / 運算子結合路徑,簡潔直觀。
  • 功能豐富彈性高:適合複雜路徑處理,可寫出簡明的高可讀性程式碼。

依使用場景選擇

os.path 適合情境

  1. 需與舊系統或 Python 2.x 相容os.path 適合舊專案維護。
  2. 簡單腳本、小型專案:若只需基本路徑操作,os.path 輕便高效。

pathlib 適合情境

  1. 新專案且使用 Python 3.x:推薦用 pathlib 提升可維護性。
  2. 需處理多重、複雜路徑:如需跨 OS 操作,pathlib 提供更便利的功能。
  3. 大型專案、重視可讀性:物件導向有助於管理複雜邏輯。

os.path 與 pathlib 的比較表

特點os.pathpathlib
資料型態字串Path 物件
導入時期Python 2.x 以前Python 3.4 以後
操作方式以函式操作物件導向操作
結合路徑os.path.join()/ 運算子
取得絕對路徑os.path.abspath()Path.resolve()
推薦用途簡易腳本、舊程式碼複雜路徑操作、新專案

使用建議總結

若你是在 Python 3.4 以後開發新專案,建議首選 pathlib,其物件導向設計能更直覺處理複雜路徑,提升可維護性與可讀性。os.path 則仍適合於維護舊專案或撰寫簡單腳本。

6. 常見問題 (FAQs)

以下是 Python 路徑操作常見問題,並提供具體解答,幫助你快速找到答案。

1. 如何取得 Python 目前的工作目錄?

你可以用 ospathlib 模組取得當前目錄。

  • 用 os 模組
import os
current_directory = os.getcwd()
print(current_directory)
  • 用 pathlib 模組
from pathlib import Path
current_directory = Path.cwd()
print(current_directory)

兩種方式都能取得當前工作目錄,可依需求選用。

2. 若資料夾不存在,如何自動建立?

Python 可用 os.makedirs()pathlib.Path.mkdir() 自動建立不存在的目錄。

  • 用 os 模組
import os
dir_path = "/path/to/directory"
if not os.path.exists(dir_path):
    os.makedirs(dir_path)
  • 用 pathlib 模組
from pathlib import Path
dir_path = Path("/path/to/directory")
if not dir_path.exists():
    dir_path.mkdir(parents=True, exist_ok=True)

pathlibparents=True 可自動建立多層目錄,實用性高。

3. 絕對路徑與相對路徑有何不同?

  • 絕對路徑:從根目錄(Windows 通常是 C:\,Linux/macOS 則是 /)開始的完整路徑,適用於任何執行位置。
  • 相對路徑:以目前目錄為基準的路徑。例如目前在 /home/user,相對路徑 docs/file.txt 就等於 /home/user/docs/file.txt

絕對路徑永遠指向唯一位置;相對路徑會因當前目錄變化而指向不同檔案。

4. os.path 與 pathlib 可同時使用嗎?

可以,同一專案中可混合用 os.pathpathlib。不過建議統一用一種以維持程式一致性。若是新專案或大型專案,推薦用 pathlib

5. 為何連接路徑時不建議用 +,而應用 os.path.join()pathlib/

雖然用 + 也能連接字串,但不同 OS 的分隔符不同(Windows 用「\」,Linux/macOS 用「/」),直接連接不易跨平台。用 os.path.join()pathlib/ 運算子能自動處理這些差異,讓程式碼更通用。

例如,+ 拼接方式如下(不建議):

# 手動拼接(不建議)
path = "/user/local" + "/" + "example.txt"

os.path.join()pathlib 則可自動生成正確路徑:

# 用 os.path
import os
path = os.path.join("/user/local", "example.txt")

# 用 pathlib
from pathlib import Path
path = Path("/user/local") / "example.txt"

 

年収訴求