更新於 2024/10/07閱讀時間約 6 分鐘

[OpenCV][Python]避免路徑中的反斜槓 \ 需要轉義的問題

在 Python 中,處理檔案路徑時,反斜槓 \ 是一個特殊的字元,它常用於轉義序列(例如 \n 代表換行符號)。

因此,如果你直接在字串中使用反斜槓,可能會產生轉義字元的誤解。為了避免路徑中的反斜槓 \ 需要轉義的問題,這種情況下會導致路徑解析錯誤。

本文將提供幾種方法來解決此問題。


先試著用VScode,右鍵點擊複製路徑

直接用這路徑來讀圖看看

D:\python\crab\d\111.jpg



程式範例

直接用複製的路徑,python會把\當作轉義符號,就無法正常讀取圖片。

import cv2

file_path = 'D:\python\crab\d\111.jpg'
img = cv2.imread(file_path)

if img:
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print('未讀取到圖片')




可以使用以下幾種方法來輕鬆處理 路徑的問題:

1. 使用 原始字符串 r''

你可以直接使用原始字符串的方式來避免反斜槓轉義問題,這樣每個反斜槓會被視為普通字符,不需要手動進行轉換:

import cv2
file_path = r'D:\python\crab\d\111.jpg'
img = cv2.imread(file_path)

if img is None:
print('未讀取到圖片')
else:
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

這樣就能正常地讀取到圖片了

2. 使用 pathlib

Python 的pathlib 提供了更方便、跨平台的處理路徑的方法,這樣你就不必手動調整 \/,這些方法會自動根據你的操作系統格式化路徑。

使用 pathlib

pathlib 是更現代化的路徑處理工具,特別適合跨平台的應用,可以自動管理路徑分隔符號。

from pathlib import Path
import cv2

# 使用 pathlib 處理路徑
file_path = Path("D:/python/crab/d/111.jpg")

# 讀取圖片
image = cv2.imread(file_path)

if image is None:
print('未讀取到圖片')
else:
print('有讀取到圖片')

這樣,你就可以不再擔心路徑分隔符號的轉換問題,pathlib 會自動根據操作系統處理路徑。Windows 上仍然會使用反斜槓顯示,但不需要手動轉換。

3. 使用 雙斜槓 \\

如果你堅持使用普通字符串,也可以用雙斜槓 \\ 來表示路徑中的反斜槓,這樣可以避免反斜槓的轉義問題,但不建議因為不美觀,也會有隱藏的問題存在

import cv2

# 使用 pathlib 處理路徑
file_path = "D://python//crab//d//111.jpg"

# 讀取圖片
image = cv2.imread(file_path)

if image is None:
print('未讀取到圖片')
else:
print('有讀取到圖片')

使用 雙斜槓 \\隱藏問題或不便:

  1. 跨平台兼容性
    • 使用雙斜槓適用於 Windows,但如果你的代碼需要在 Linux 或 macOS 上運行,它們使用的是正斜槓 / 作為路徑分隔符號。儘管 Python 自動處理 Windows 和 Linux 之間的路徑分隔符(反斜槓和正斜槓),但在多個系統中混合使用雙斜槓和正斜槓可能會讓代碼變得不易讀、難以維護。
  2. 代碼可讀性降低
    例如:
    path = "D:\\python\\project\\data\\images\\test.jpg"
    • 雙斜槓 \\ 在路徑中看起來比較冗長,尤其是在長路徑中。這會降低代碼的可讀性,讓人難以快速理解這段代碼,特別是在路徑中有許多文件夾時。
  3. 易出錯
    • 如果忘記了某處應該使用雙斜槓,可能會導致難以追蹤的錯誤。例如,單斜槓 \n 是換行符,\t 是製表符,這樣的情況可能會導致路徑解析錯誤,或者出現奇怪的轉義行為。
  4. 不符合現代化編程風格
    • 在 Python 3.4 引入 pathlib 之後,處理路徑的現代化方法(如 pathlib.Path)更推薦,這樣能自動處理跨平台的路徑問題,讓代碼更加一致並且容易維護。



建議的替代方案:

最方便的方法是使用 pathlib原始字符串 r'',這樣不僅解決了路徑分隔符號的問題,還能讓你的代碼更加跨平台和易讀。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.