WPS PIN 碼是什么意思
936
2025-03-31
@TOC
今天在做Python文件處理的時候遇到這樣一個問題。
使用鼠標右鍵獲取到文件路徑并使用的時候發現總是發生錯誤,導致文件路徑讀取失敗。
然后上網查了一下發現很多小伙伴都經歷過類似的問題,網上的回答也有很多,但是大部分都是說在路徑字符串前加r變成原始字符串、或者手動輸入路徑字符串進行解決。
以下是大灰狼按照網上已有一些方法進行的嘗試:
嘗試一:將復制到的路徑前加上r成為原始字符串:
#文件路徑修改為原始字符串 import shutil import os.path as op path1 = r'D:\data\venv\test.txt' #從文件夾直接復制而來的路徑 path2 = r'D:\data\.idea' #從文件夾直接復制而來的路徑 shutil.copy(path1, path2)
如上面代碼所示,在復制到的文件路徑前加上r成為原始字符串之后,運行結果并沒有任何變化,仍然是顯示這樣的錯誤:
嘗試二:文件路徑手動輸入
之后大灰狼又將字符手動輸入,并在字符串前方分別使用了r和沒有使用r。
發現文件路徑在手動輸入的情況下,即使不將路徑變為原始字符串,程序仍然可以運行:
#文件路徑手動輸入 import shutil import os.path as op path1 = r'D:\data\venv\test.txt' #手寫的路徑 path2 = r'D:\data\.idea' #手寫的路徑 shutil.copy(path1, path2)
運行結果:
但是將前后兩個代碼細心對比的小伙伴就會發現。
除了文件路徑一個是復制過來的、一個是手動輸入的以外,在代碼上并沒有任何區別,但是就是這樣的兩個代碼,手動輸入的可以運行,而復制過來的路徑無法運行。
這就很是疑惑了,明明是看上去一模一樣的兩個代碼,為什么運行之后會有這樣的差別呢?
嘗試三:文件路徑分割
于是我將復制而來的文件路徑進行了分割對比,這一對比,那可壞了!
代碼是這樣的:
#文件路徑分割 import shutil import os.path as op path1 = r'D:\data\venv\test.txt' #從文件夾直接復制而來的路徑 path2 = r'D:\data\.idea' #從文件夾直接復制而來的路徑 print(path1.split('\')) print(path2) shutil.copy(path1, path2)
我將復制過來的兩個路徑字符串,第一個以反斜杠將其分割成列表形式,而第二個不做任何處理直接輸出,發現運行結果是這樣的:
未做處理的路徑在輸出出來以后并沒有發現什么異常,但是經過反斜杠分割處理后的路徑就不一樣了。在文件路徑的的最前方竟然出現了\u202a!
當時的我也是十分的懵逼…
從代碼中可以看到,我們的文件路徑的字符串中并未有\u202a,而在經過分割之后的列表中竟然出現了\u202a,但是第二個同樣也是復制過來的路徑,未處理直接輸出,卻沒有\u202a的字符串出現。
此時此刻的大灰狼也是嚇出了一身冷汗…難道這就是傳說中神秘的\u202a字符嘛?
真相大白!
帶著對\u202a百思不得其解的好奇,我踏上了詢問度娘的漫漫征程。
好家伙,不查不知道,一查嚇一跳!
\u202a這個字符其實一直都存在,只不過是我們凡人的肉眼還沒有齊天大圣般程序猿的法力,單憑借簡單的輸出并不能讓這個字符顯出原形。
但不可否認的是,在我們右擊文件復制其路徑的時候,\u202a這個字符就已經存在我們的剪切板上了,但是在我們粘貼的時候它并不會讓我們看見。
更神奇的是,這個字符并不是我們每次右擊復制文件路徑時都會出現。
它只會在我們從右向左復制的時候出現\u202a,而從左向右復制的時候并不會出現這個字符。
嗯…還有這神操作…
看到這里,相比我們這等凡人對于\u202a的神秘之處也略知一二了吧。
沒錯,我們平常讀取文件路徑的時候,都是從左向右讀取的,依次是:某一個盤/文件夾/文件,并不是文件/文件夾/某一個盤這樣。
但是在我們右擊文件復制路徑的時候,難免會從左或從右開始復制,所以在計算機上,為了對于那些從右至左復制而來的路徑,在讀取的時候可以從左向右讀取,就會在文件路徑前隱式的加上\u202a,表示路徑是從左向右讀取的。
所以這個符號應該是windows在做文件名顯示的時候,為了保證文件路徑是從左往右顯示所加的強制字符。
現在了解了\u202a存在的原因,接下來就是在我們復制文件路徑之后并在程序中使用它的時候,如何去掉這個看不見的字符串,
嘗試四:normpath()函數處理路徑
大灰狼在網上也有看到說使用os.path包的normpath()函數可以解決。
在這里說明一下normpath()函數的作用:將路徑正規化:去除多余的分隔符,將 . 和 … 變成真實路徑,處理錯誤的斜杠。
聽著好像是有點用哈,于是大灰狼帶著滿心的疑惑使用normpath()函數嘗試了一下,萬一可以呢不是。
并且為了更加直觀的看到normpath()函數是否可以將文件路徑正規化,大灰狼將同樣將經過normpath()函數處理后的兩個文件路徑分割和不分割處理,代碼如下:
#normpath()函數處理 import shutil import os.path as op path1 = op.normpath(r'D:\data\venv\test.txt') #從文件夾直接復制而來的路徑 path2 = op.normpath(r'D:\data\.idea') #從文件夾直接復制而來的路徑 print(path1.split('\\')) #將路徑1以反斜杠分隔為列表輸出 print(path2) shutil.copy(path1, path2)
結果可想而知,normpath()函數并沒有對文件路徑做出改變,在進行分割時候輸出的結果上還是存在\u202a。
這下可好了,嘗試了網上的很多方法,還是無法解決這個\u202a的文件路徑問題。
但是對于我這樣一個連寫代碼都不想多敲一下鍵盤的程序猿來說,怎么可能一次次的手動輸入文件路徑,或者一次次的修改路徑呢,于是就有了這樣的神奇操作…
定義函數處理問題
沒錯!為了更好的偷懶,我寫了這樣一個處理函數,該函數接收的變量是一個文件路徑,也就是我們從文件屬性中復制過來的文件路徑,經過該函數的處理之后,可以重新返回一個可以被程序使用的沒有\u202a的正規路徑。
并且是使用正斜杠連接,不會出現因為反斜杠而導致的轉義字符錯誤。
我的代碼實現效果如下:
#函數處理 import shutil import os.path as op path1 = 'D:\dmp\path\Test.txt' #從文件夾直接復制而來的路徑 path2 = 'D:\dmp\deposit' #從文件夾直接復制而來的路徑 '''將負責路徑而來的路徑標準化''' def path_normal(path): path = path.split('\\') path[0] = path[0][-2: len(path[0])] path = '/'.join(path) return path print('轉換前:' + path1) print('分割成列表:') print(path1.split('\\')) path1 = path_normal(path1) #調用函數進行路徑轉換 print('轉換后:' + path1) print('分割成列表:') print(path1.split('/')) path2 = path_normal(path2) shutil.copy(path1, path2) #復制文件和文件夾
運行結果:
可以看出,經過這個函數處理后的文件路徑再次以斜杠分割以后,并沒有出現\u202a的字符串,并且在直接運用到文件處理的函數時沒有報錯。
函數比較簡單,只有四行代碼便將在文件路徑前看不到\u202a分離出來了,比較實用。
函數的使用方法是傳入需要處理的文件路徑,并將處理后的正規路徑返回出來,只需要接收就可以使用了。
路徑標準化處理函數
以下是該函數的代碼:
#路徑標準化處理 '''將負責路徑而來的路徑標準化''' def path_normal(path): path = path.split('\\') path[0] = path[0][-2: len(path[0])] path = '/'.join(path) return path
現在,你應該對于復制文件路徑報錯的原因和處理方法有了簡單的了解了吧,雖然比較簡單,但也的確是很多程序中比較常見和容易忽略的錯誤。起來以備后用!
覺得不錯記得關注喔,
大灰狼期待與你一同進步!
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。