1. 程式人生 > 程式設計 >Python列印不合法的檔名

Python列印不合法的檔名

問題

你的程式獲取了一個目錄中的檔名列表,但是當它試著去列印檔名的時候程式崩潰, 出現了 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 列印檔名的資料請關注我們其它相關文章!