Python列印不合法的檔名
阿新 • • 發佈:2020-08-02
問題
你的程式獲取了一個目錄中的檔名列表,但是當它試著去列印檔名的時候程式崩潰, 出現了 UnicodeEncodeError 異常和一條奇怪的訊息—— surrogates not allowed 。
解決方案
當列印未知的檔名時,使用下面的方法可以避免這樣的錯誤:
def bad_filename(filename): return repr(filename)[1:-1] try: print(filename) except UnicodeEncodeError: print(bad_filename(filename))
如果你有程式碼需要操作檔名或者將檔名傳遞給 open() 這樣的函式,一切都能正常工作。 只有當你想要輸出檔名時才會碰到些麻煩(比如列印輸出到螢幕或日誌檔案等)。 特別的,當你想列印上面的檔名列表時,你的程式就會崩潰:
>>> for name in files: ... print(name) ... spam.py Traceback (most recent call last): File "<stdin>",line 2,in <module> 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() 函式中怎樣處置取決於你自己。 另外一個選擇就是通過某種方式重新編碼,示例如下:
def bad_filename(filename): temp = filename.encode(sys.getfilesystemencoding(),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 >>>
這一小節主題可能會被大部分讀者所忽略。但是如果你在編寫依賴檔名和檔案系統的關鍵任務程式時, 就必須得考慮到這個。否則你可能會在某個週末被叫到辦公室去除錯一些令人費解的錯誤。
以上就是Python列印不合法的檔名的詳細內容,更多關於Python 列印檔名的資料請關注我們其它相關文章!