問題
你的程式獲取了乙個目錄中的檔名列表,但是當它試著去列印檔案名的時候程式崩潰, 出現了 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...