簡體   English   中英

pprint: UnicodeEncodeError: 'ascii' 編解碼器無法編碼字符

[英]pprint: UnicodeEncodeError: 'ascii' codec can't encode character

這讓我發瘋。 我試圖用é char pprint一個dict ,它把我扔出去了。

我正在使用 Python 3:

    from pprint import pprint
    knights = {'gallahad': 'the pure', 'robin': 'the bravé'}
    pprint (knights)

錯誤:

File "/data/prod_envs/pythons/python36/lib/python3.6/pprint.py", line 176, in _format
stream.write(rep)
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 43: ordinal not in range(128)

我閱讀了 Python ASCII 文檔,但似乎沒有一種快速的方法可以解決這個問題,除了將 dict 拆開,然后通過.encode將違規值重寫為 ASCII 值,然后再次重新組裝 dict

有什么辦法可以在不拆開字典的情況下打印出來?

這是無關pprint :模塊僅格式化字符串轉換成另一個字符串,然后經過格式化的字符串的基礎流。 因此,當é字符 (U+00E9) 寫入 stdout 時,會發生您的錯誤。

現在它真的取決於底層操作系統和 Python 解釋器的配置。 在 Linux 或其他類 Unix 系統中,您可以嘗試通過在啟動 Python 之前設置環境變量PYTHONIOENCODING在終端會話中聲明 UTF-8 或 Latin1 字符集:

$ export PYTHONIOENCODING=Latin1
$ python

(或根據終端或終端窗口的實際編碼使用PYTHONIOENCODING=utf8 )。

標准輸入和輸出是 Python 中的文件對象。 Python 3 文檔說,當創建這些對象時,如果未指定encodinglocale.getpreferredencoding(False)以獲取區域設置的首選編碼。

在安裝 GNU/Linux 時,您的系統應該已經設置了一個或多個“語言環境”(我從您的路徑中猜測您正在使用某個版本的 GNU/Linux)。 在“合理”設置中,默認語言環境應允許使用 UTF-8。 但是,如果您只進行了“最小”安裝(例如作為設置容器的一部分)或類似的東西,那么系統可能已將語言環境設置為"C" (最終的后備語言環境),這確實不支持UTF-8。

僅僅因為您的終端可以接受 UTF-8(如使用echo和 UTF-8 字符串所示),並不意味着Python 知道UTF-8 是可以接受的。 如果 Python 看到語言環境設置為"C"則除非另有說明,否則它將假定只允許使用 ASCII。

您可以通過在 shell 提示符下鍵入locale來檢查當前區域locale ,並通過設置LC_ALL環境變量來更改它。 但是在更改它之前,您必須檢查locale -a以查看您的系統上可用的語言環境,否則您的更改可能無效並且無論如何您可能會獲得"C"語言環境。 如果您的系統沒有設置您想要的語言環境,如果您有 root 訪問權限,您可以添加它:大多數 GNU/Linux 發行版在您(重新)配置名為locales的包時提供了執行此操作的選項,例如在 Debian 上/Ubuntu-based 發行版, sudo dpkg-reconfigure locales應該會顯示選項。

但有時你會在無需編寫Python腳本尚未建立體面的語言環境的系統上運行的尷尬境地並沒有什么可以做,因為你沒有root和系統管理員堅持給你絕對的最小值。 我們怎么辦?

好吧,Python 本身就有選項。 您可以在運行 Python 之前運行export PYTHONIOENCODING=utf-8 ,以告訴 Python 使用該編碼,無論語言環境如何。 或者你可以給pprint一個stream=參數,設置為你自己使用open()encoding="utf-8"參數open()的流(盡管如果你想使用sys.stdoutos.popen而不是文件)。 或者您可以升級到 Python 3.7 並使用sys.stdout.reconfigure(encoding='utf-8') (但這在原始問題中提到的 Python 3.6 中不起作用)。

或者,您可以import codecs並執行w=codecs.getwriter("utf-8")(sys.stdout.buffer)然后將stream=w傳遞給您的pprint

from pprint import pprint
import sys, codecs
w=codecs.getwriter("utf-8")(sys.stdout.buffer)
d = {"testing": "這是個考驗"}
pprint (d, stream=w)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM