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

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

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

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

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


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

直接用這路徑來讀圖看看

D:\python\crab\d\111.jpg
raw-image



程式範例

直接用複製的路徑,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('未讀取到圖片')
raw-image




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

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()

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

raw-image

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('有讀取到圖片')
raw-image

這樣,你就可以不再擔心路徑分隔符號的轉換問題,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'',這樣不僅解決了路徑分隔符號的問題,還能讓你的代碼更加跨平台和易讀。

avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
通常發生在先安裝opencv-contrib-python,在接著安裝opencv-python會發生報錯。 雖然先前也發生一樣的事情,但在換電腦後重新安裝時,也發生同樣的錯誤XD。 報錯訊息 AttributeError: module 'cv2.dnn_superres' has no a
在 Python 中,你可以使用 raise 關鍵字手動觸發錯誤。這對於測試異常處理或在特定情況下停止程式執行非常有用。 本文主說明在影像處理中常見的異常情況,展示如何使用 raise 來觸發不同類型的錯誤。 1. 檔案不存在 (FileNotFoundError) 在影像處理中,如果要讀取
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
使用cv2.imread讀取圖片時,如果路徑有包含到中文,就會報錯。 本文將提供另外一個方式cv2.imdecode,路徑有包含到中文時仍可以正常讀取圖片。 測試範例 import cv2 img = cv2.imread('D:/CRABpy/write/圖檔/chars_01.png'
通常發生在先安裝opencv-contrib-python,在接著安裝opencv-python會發生報錯。 雖然先前也發生一樣的事情,但在換電腦後重新安裝時,也發生同樣的錯誤XD。 報錯訊息 AttributeError: module 'cv2.dnn_superres' has no a
在 Python 中,你可以使用 raise 關鍵字手動觸發錯誤。這對於測試異常處理或在特定情況下停止程式執行非常有用。 本文主說明在影像處理中常見的異常情況,展示如何使用 raise 來觸發不同類型的錯誤。 1. 檔案不存在 (FileNotFoundError) 在影像處理中,如果要讀取
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
使用cv2.imread讀取圖片時,如果路徑有包含到中文,就會報錯。 本文將提供另外一個方式cv2.imdecode,路徑有包含到中文時仍可以正常讀取圖片。 測試範例 import cv2 img = cv2.imread('D:/CRABpy/write/圖檔/chars_01.png'
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
Thumbnail
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
給定兩個輸入整數陣列, 若在兩個陣列遇到相同的數字可以連成一線, 但是有規定連線不可和別的連線有交叉, 請問最多可以形成幾條連線? 解答中探討了演算法化簡的技巧和DP模型, 可以透過演算法化簡的技巧, 把這題映射到原本已經學會的Longest Common Subsequence的DP模型來解開。
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
Thumbnail
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
Thumbnail
題目敘述 題目給定我們一顆二元樹的根節點,要求我們計算出從根節點到葉子節點的偽回文路徑路徑有幾條? 偽回文路徑路徑 的定義: 路徑經過重新排列之後,可以形成回文Palindrome,也就是頭尾鏡像對稱。 ​ 例如: 1 -> 3 -> 3 重新排列之後,可以形成 3 -> 1 -> 3
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
Thumbnail
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
給定兩個輸入整數陣列, 若在兩個陣列遇到相同的數字可以連成一線, 但是有規定連線不可和別的連線有交叉, 請問最多可以形成幾條連線? 解答中探討了演算法化簡的技巧和DP模型, 可以透過演算法化簡的技巧, 把這題映射到原本已經學會的Longest Common Subsequence的DP模型來解開。
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
Thumbnail
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
Thumbnail
題目敘述 題目給定我們一顆二元樹的根節點,要求我們計算出從根節點到葉子節點的偽回文路徑路徑有幾條? 偽回文路徑路徑 的定義: 路徑經過重新排列之後,可以形成回文Palindrome,也就是頭尾鏡像對稱。 ​ 例如: 1 -> 3 -> 3 重新排列之後,可以形成 3 -> 1 -> 3
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,