Python列印不合法的檔名

2022-09-26 10:15:36 字數 1718 閱讀 1383

問題

你的程式獲取了乙個目錄中的檔名列表,但是當它試著去列印檔案名的時候程式崩潰, 出現了 unicodeencodeerror 異常和一條奇怪的訊息—— surrogates not allowed 。

解決方案

當列印未知的檔名時,使用下面的方法可以避免這樣的錯誤:

def bad_filename(filename):

return repr(filename)[1:-1]

try:

print(filename)

except unicodeencodeerror:

print(bad_filename(filename))

如果你有**需要操作檔名或者將檔名傳遞給 open() 這樣的函式,一切都能正常工作程式設計客棧。 只有當你想要輸出檔名時才會碰到些麻煩(比如列印輸出到螢幕或日誌檔案等)。 特別的,當你想列印上面的檔名列表時,你的程式程式設計客棧就會崩潰:

>>>euvygt; for name in files:

... print(name)

...spam.py

traceback (most recent call last):

file "", line 2, in

unicodeencodeerror: 'utf-8' codec can't encode character '\udce4' in

position 1: surrogates not allowed

>>>

>>> for name in files:

... try:

... print(name)

... except unicodeencodeerror:

... print(bad_filename(name))

...spam.py

b\udce4d.txt

foo.txt

>>>

在 bad_filename() 函式中怎樣處置取決於你自己。 另外乙個選擇就是通過某種方式重新編碼,示例如下:

teuvygdef bad_filename(filename):

temp = filename errors='surrogateescape')

return temp.decode('latin-1')

譯者注:

surrogateescape:

這種是python在絕大部分面向os的api中所使用的錯誤處理器,

它能以一種優雅的方式處理由作業系統提供的資料的編碼問題。

在解碼出錯時會將出錯位元組儲存到乙個很少被使用到的unicode編碼範圍內。

在編碼時將那些隱藏值又還原回原先解碼失敗的位元組序列。

它不僅對於os api非常有用,也能很容易的處理其他情況下的編碼錯誤。

使用這個版本產生的輸出如下:

>>> for name in files:

... try:

... print(name)

... except unicodeencodeerror:

... print(bad_filename(name))

...spam.py

bäd.txt

foo.txt

>>>

這一小節主題可能會被大部分讀者所忽略。但是如果你在編寫依賴檔名和檔案系統的關鍵任務程式時, 就必須得考慮到這個。否則你可能會在某個週末被叫到辦公室去除錯一些令人費解的錯誤。

對不起,您輸入的內容不合法

v python全棧21期 if 全棧 in v print 包含敏感字元 v alex oldboy 張三 李四 if 李四 in v print 包含敏感字元 元組 tuple 同理v 預設按照鍵判斷,即判斷x是否是字典中的鍵 if x in v pass 問題1 判斷k1是否在v中?v if ...

iOS開發中URL中不合法字元的轉義

通常我們在拼接網路請求url的時候,比如請求網路,通過get方法請求網路資料,有時會遇到請求失敗的問題,於是各種找原因,就是不明白問題出在 我也是遇到了這種問題最後才發現我本來請求介面裡有個 而到伺服器端反饋給我的資訊顯示變成了空格 後來才反應過來,原來是請求之前要對url中的特殊字元進行轉義!通常...

單鏈表反轉 不合法的路徑位址轉變為合法路徑

單鏈表結構 單鏈表反轉問題就不細說,網上能找到很多。使用三個變數l m r互相賦值迭代,並建立指向關係,從而實現單鏈表的反轉。直接上 class node object def init self,data,next none self.val data self.next next def rev...