将字典转储为 UTF-8 格式的 json 文件

bir*_*n04 7 python encoding json character-encoding

我想将字典转储到文件,就像将 Python 字典转储到 JSON 文件中一样。但我遇到了编码问题:\n当我简单地这样做时

\n\n
print(data) \n
Run Code Online (Sandbox Code Playgroud)\n\n

我在终端中得到类似的信息:

\n\n
{\'legend\': \'\\n\\r\\n\\t\\t\xd0\x9d\xd0\xb0 \xd0\xbf\xd1\x80\xd1\x8f\xd0\xbc\xd0\xbe\xd0\xb9 \xd1\x80\xd0\xb0\xd1\x81\xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb6\xd0\xb5\xd0\xbd\xd1\x8b \xd1\x81\xd1\x82\xd0\xbe\xd0\xb9\xd0\xbb\xd0\xb0, \xd0\xb2 \xd0\xba\xd0\xbe\xd1\x82\xd0\xbe\xd1\x80\xd1\x8b\xd0\xb5 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x85\xd0\xbe\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xbe \xd1\x80\xd0\xb0\xd1\x81\xd1\x81\xd1\x82\xd0\xb0\xd0\xb2\xd0\xb8\xd1\x82\xd1\x8c \xd0\xba\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb2 \xd1\x82\xd0\xb0\xd0\xba, \xd1\x87\xd1\x82\xd0\xbe\xd0\xb1\xd1\x8b \xd0\xbc\xd0\xb8\xd0\xbd\xd0\xb8\xd0\xbc\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xbe\xd0\xb5 \xd1\x80\xd0\xb0\xd1\x81c\xd1\x82\xd0\xbe\xd1\x8f\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xbc\xd0\xb5\xd0\xb6\xd0\xb4\xd1\x83 \xd0\xba\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbc\xd0\xb8 \xd0\xb1\xd1\x8b\xd0\xbb\xd0\xbe \xd0\xba\xd0\xb0\xd0\xba \xd0\xbc\xd0\xbe\xd0\xb6\xd0\xbd\xd0\xbe \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xb5.\\r\\n    \\n\', \'input_specification\': \'\\n\\r\\n     \xd0\x92\xd1\x85\xd0\xbe\xd0\xb4\xd0\xbd\xd1\x8b\xd0\xb5 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb5\\r\\n    \\n\\r\\n\\t\\t\xd0\x92 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb2\xd0\xbe\xd0\xb9 \xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb5 \xd0\xb2\xd0\xb2\xd0\xbe\xd0\xb4\xd1\x8f\xd1\x82\xd1\x81\xd1\x8f \xd1\x87\xd0\xb8\xd1\x81\xd0\xbb\xd0\xb0 N\\xa0 (2 < N  < 10001) \xe2\x80\x93 \xd0\xba\xd0\xbe\xd0\xbb\xd0\xb8\xd1\x87\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd0\xbe \xd1\x81\xd1\x82\xd0\xbe\xd0\xb9\xd0\xbb \xd0\xb8 K\\xa0 (1 < K < N ) \xe2\x80\x93 \xd0\xba\xd0\xbe\xd0\xbb\xd0\xb8\xd1\x87\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd0\xbe \xd0\xba\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb2. \xd0\x92\xd0\xbe \xd0\xb2\xd1\x82\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb9 \xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb5\\xa0\xd0\xb7\xd0\xb0\xd0\xb4\xd0\xb0\xd1\x8e\xd1\x82\xd1\x81\xd1\x8f N \xd0\xbd\xd0\xb0\xd1\x82\xd1\x83\xd1\x80\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd1\x85 \xd1\x87\xd0\xb8\xd1\x81\xd0\xb5\xd0\xbb \xd0\xb2 \xd0\xbf\xd0\xbe\xd1\x80\xd1\x8f\xd0\xb4\xd0\xba\xd0\xb5 \xd0\xb2\xd0\xbe\xd0\xb7\xd1\x80\xd0\xb0\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f \xe2\x80\x93 \xd0\xba\xd0\xbe\xd0\xbe\xd1\x80\xd0\xb4\xd0\xb8\xd0\xbd\xd0\xb0\xd1\x82\xd1\x8b \xd1\x81\xd1\x82\xd0\xbe\xd0\xb9\xd0\xbb (\xd0\xba\xd0\xbe\xd0\xbe\xd1\x80\xd0\xb4\xd0\xb8\xd0\xbd\xd0\xb0\xd1\x82\xd1\x8b \xd0\xbd\xd0\xb5 \xd0\xbf\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd1\x81\xd1\x85\xd0\xbe\xd0\xb4\xd1\x8f\xd1\x82 109)\\r\\n    \\n\', \'output_specification\': \'\\n\\r\\n     \xd0\x92\xd1\x8b\xd1\x85\xd0\xbe\xd0\xb4\xd0\xbd\xd1\x8b\xd0\xb5 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb5\\r\\n    \\n\\r\\n\\t\\t\xd0\x92\xd1\x8b\xd0\xb2\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x82\xd0\xb5 \xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe \xd1\x87\xd0\xb8\xd1\x81\xd0\xbb\xd0\xbe \xe2\x80\x93 \xd0\xbd\xd0\xb0\xd0\xb8\xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xb5\xd0\xb5 \xd0\xb2\xd0\xbe\xd0\xb7\xd0\xbc\xd0\xbe\xd0\xb6\xd0\xbd\xd0\xbe\xd0\xb5 \xd0\xb4\xd0\xbe\xd0\xbf\xd1\x83\xd1\x81\xd1\x82\xd0\xb8\xd0\xbc\xd0\xbe\xd0\xb5 \xd1\x80\xd0\xb0\xd1\x81\xd1\x81\xd1\x82\xd0\xbe\xd1\x8f\xd0\xbd\xd0\xb8\xd0\xb5.\\r\\n    \\n\'}\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以它是正常的、人类可读的文本。但是当我以这种方式将相同的字典转储到某个 json 文件时:

\n\n
with open(\'Data\\{0}.json\'.format(i), \'w\') as file:\n        json.dump(data, file) \n
Run Code Online (Sandbox Code Playgroud)\n\n

文件中有一些奇怪的特殊字符:

\n\n
{"legend": "\\n\\r\\n\\t\\t\\u041d\\u0430 \\u043f\\u0440\\u044f\\u043c\\u043e\\u0439 \\u0440\\u0430\\u0441\\u043f\\u043e\\u043b\\u043e\\u0436\\u0435\\u043d\\u044b \\u0441\\u0442\\u043e\\u0439\\u043b\\u0430, \\u0432 \\u043a\\u043e\\u0442\\u043e\\u0440\\u044b\\u0435 \\u043d\\u0435\\u043e\\u0431\\u0445\\u043e\\u0434\\u0438\\u043c\\u043e \\u0440\\u0430\\u0441\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044c \\u043a\\u043e\\u0440\\u043e\\u0432 \\u0442\\u0430\\u043a, \\u0447\\u0442\\u043e\\u0431\\u044b \\u043c\\u0438\\u043d\\u0438\\u043c\\u0430\\u043b\\u044c\\u043d\\u043e\\u0435 \\u0440\\u0430\\u0441c\\u0442\\u043e\\u044f\\u043d\\u0438\\u0435 \\u043c\\u0435\\u0436\\u0434\\u0443 \\u043a\\u043e\\u0440\\u043e\\u0432\\u0430\\u043c\\u0438 \\u0431\\u044b\\u043b\\u043e \\u043a\\u0430\\u043a \\u043c\\u043e\\u0436\\u043d\\u043e \\u0431\\u043e\\u043b\\u044c\\u0448\\u0435.\\r\\n    \\n", "input_specification": "\\n\\r\\n     \\u0412\\u0445\\u043e\\u0434\\u043d\\u044b\\u0435 \\u0434\\u0430\\u043d\\u043d\\u044b\\u0435\\r\\n    \\n\\r\\n\\t\\t\\u0412 \\u043f\\u0435\\u0440\\u0432\\u043e\\u0439 \\u0441\\u0442\\u0440\\u043e\\u043a\\u0435 \\u0432\\u0432\\u043e\\u0434\\u044f\\u0442\\u0441\\u044f \\u0447\\u0438\\u0441\\u043b\\u0430 N\\u00a0 (2 < N  < 10001) \\u2013 \\u043a\\u043e\\u043b\\u0438\\u0447\\u0435\\u0441\\u0442\\u0432\\u043e \\u0441\\u0442\\u043e\\u0439\\u043b \\u0438 K\\u00a0 (1 < K < N ) \\u2013 \\u043a\\u043e\\u043b\\u0438\\u0447\\u0435\\u0441\\u0442\\u0432\\u043e \\u043a\\u043e\\u0440\\u043e\\u0432. \\u0412\\u043e \\u0432\\u0442\\u043e\\u0440\\u043e\\u0439 \\u0441\\u0442\\u0440\\u043e\\u043a\\u0435\\u00a0\\u0437\\u0430\\u0434\\u0430\\u044e\\u0442\\u0441\\u044f N \\u043d\\u0430\\u0442\\u0443\\u0440\\u0430\\u043b\\u044c\\u043d\\u044b\\u0445 \\u0447\\u0438\\u0441\\u0435\\u043b \\u0432 \\u043f\\u043e\\u0440\\u044f\\u0434\\u043a\\u0435 \\u0432\\u043e\\u0437\\u0440\\u0430\\u0441\\u0442\\u0430\\u043d\\u0438\\u044f \\u2013 \\u043a\\u043e\\u043e\\u0440\\u0434\\u0438\\u043d\\u0430\\u0442\\u044b \\u0441\\u0442\\u043e\\u0439\\u043b (\\u043a\\u043e\\u043e\\u0440\\u0434\\u0438\\u043d\\u0430\\u0442\\u044b \\u043d\\u0435 \\u043f\\u0440\\u0435\\u0432\\u043e\\u0441\\u0445\\u043e\\u0434\\u044f\\u0442 109)\\r\\n    \\n", "output_specification": "\\n\\r\\n     \\u0412\\u044b\\u0445\\u043e\\u0434\\u043d\\u044b\\u0435 \\u0434\\u0430\\u043d\\u043d\\u044b\\u0435\\r\\n    \\n\\r\\n\\t\\t\\u0412\\u044b\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u043e\\u0434\\u043d\\u043e \\u0447\\u0438\\u0441\\u043b\\u043e \\u2013 \\u043d\\u0430\\u0438\\u0431\\u043e\\u043b\\u044c\\u0448\\u0435\\u0435 \\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u043e\\u0435 \\u0434\\u043e\\u043f\\u0443\\u0441\\u0442\\u0438\\u043c\\u043e\\u0435 \\u0440\\u0430\\u0441\\u0441\\u0442\\u043e\\u044f\\u043d\\u0438\\u0435.\\r\\n    \\n"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试指定Ensure_ascii=False ,如下所示:Python Saving JSON Files as UTF-8,但它会抛出 UnicodeEncodeError:

\n\n
UnicodeEncodeError: \'charmap\' codec can\'t encode characters in position 11-12: character maps to <undefined>\n
Run Code Online (Sandbox Code Playgroud)\n\n

总而言之,如何将字典转储到 JSON 文件而不弄乱编码?

\n

han*_*ras 12

您需要打开指定文件编码的文件。

with open('Data{0}.json'.format(1), 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False)
Run Code Online (Sandbox Code Playgroud)

这样我就成功转储了你的示例数据。

  • @skaul05 不,[`open` 使用 `locale.getpreferredencoding(False)`](https://docs.python.org/3/library/functions.html#open),这取决于操作系统和终端配置。最好明确并指定编码。并非所有 Linux 都正确配置了 UTF-8,并且 Windows 终端也不使用它,尽管某些 Python IDE 会使用它。 (2认同)