1

这真让我抓狂。我正在尝试pprint使用é char,但它让我失望了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 拆开,并通过 将有问题的值重写为 ASCII 值.encode,然后再次重新组装 dict

有没有什么办法可以在不拆开字典的情况下打印出来?

4

2 回答 2

7

这与pprint:模块仅将字符串格式化为另一个字符串,然后将格式化的字符串传递给底层流。因此,当将é字符 (U+00E9) 写入标准输出时,就会发生错误。

现在它真的取决于底层操作系统和 Python 解释器的配置。在 Linux 或其他类 Unix 系统中,您可以尝试通过PYTHONIOENCODING在启动 Python 之前设置环境变量来在终端会话中声明 UTF-8 或 Latin1 字符集:

$ export PYTHONIOENCODING=Latin1
$ python

(或PYTHONIOENCODING=utf8根据终端或终端窗口的实际编码使用)。

于 2017-12-30T14:09:04.393 回答
0

标准输入和输出是 Python 中的文件对象。 Python 3 文档说,创建这些对象时,如果encoding未指定,则locale.getpreferredencoding(False)调用 if 以获取语言环境的首选编码。

安装 GNU/Linux 时,您的系统应该已经设置了一个或多个“语言环境”(我从您的路径猜测您正在使用某个版本的 GNU/Linux)。在“合理”的设置中,默认语言环境应允许 UTF-8。但是,如果您只进行了“最小”安装(例如作为设置容器的一部分)或类似的安装,那么系统可能已将语言环境设置为"C"(最终的后备语言环境),它不支持 UTF -8。

仅仅因为您的终端可以接受 UTF-8(如使用echoUTF-8 字符串所证明的那样),并不意味着Python 知道UTF-8 是可以接受的。如果 Python 看到语言环境设置为,"C"那么它将假定只允许使用 ASCII,除非另有说明。

locale您可以通过在 shell 提示符下键入来检查当前语言环境,并通过设置LC_ALL环境变量来更改它。但是在更改它之前,您必须检查locale -a您的系统上有哪些可用的语言环境,否则您的更改可能无效,并且您仍然可能获得该"C"语言环境。如果您的系统没有设置您想要的语言环境,如果您有 root 访问权限,则可以添加它:大多数 GNU/Linux 发行版在您(重新)配置一个名为 的包时提供执行此操作的选项locales,例如在 Debian/基于 Ubuntu 的发行版sudo dpkg-reconfigure locales应该会向您展示这些选项。

但有时你会处于尴尬的境地,不得不编写一个 Python 脚本才能在一个没有设置好的语言环境的系统上运行,而且你无能为力,因为你没有 root 并且系统管理员坚持给你绝对的最低限度。 我们怎么办?

好吧,Python 本身有一些选项。您可以export PYTHONIOENCODING=utf-8在运行 Python 之前运行,以告诉 Python 无论语言环境如何使用该编码。或者您可以提供pprint一个参数,设置为您自己使用参数stream=打开的流(尽管如果您想使用或代替文件,这并不好)。或者您可以升级到 Python 3.7 并使用(但这在原始问题中提到的 Python 3.6 中不起作用)。open()encoding="utf-8"sys.stdoutos.popensys.stdout.reconfigure(encoding='utf-8')

或者,您可以import codecsw=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)
于 2020-02-04T12:26:53.740 回答