Python yaml 按原样转储表情符号

aah*_*nik 3 python encoding yaml pyyaml

我正在使用python 3.9.5, 和PyYaml 5.4.1.

\n

t.yml我有一个包含以下内容的文件。

\n
- \xe2\xac\x86\xef\xb8\x8f\n
Run Code Online (Sandbox Code Playgroud)\n

我编写了一个简单的 python 代码,用于读取 yaml 文件并将其转储回来。

\n
import yaml\n\nwith open("t.yml") as file:\n    con = yaml.safe_load(file)\n    print(con)\n    with open("t.yml","w") as file:\n        yaml.dump(con,file)\n
Run Code Online (Sandbox Code Playgroud)\n

代码的输出是:

\n
[\'\xe2\xac\x86\xef\xb8\x8f\']\n
Run Code Online (Sandbox Code Playgroud)\n

转储yaml后,t.yml文件变成这样:

\n
- "\\u2B06\\uFE0F\\U0001F622"\n
Run Code Online (Sandbox Code Playgroud)\n

如何以与我加载的完全相同的格式转储表情符号?

\n

fly*_*lyx 5

通常,YAML 在加载文件时会丢失信息(请参阅此问题),因此您不能总是按照其编写方式转储它,因为有关其编写方式的信息已丢失。

\n

在这种情况下,解决方案是设置allow_unicode

\n
import sys,yaml\n\ninput = """\n- \xe2\xac\x86\xef\xb8\x8f\n"""\n\ncon = yaml.safe_load(input)\nyaml.dump(con,sys.stdout, allow_unicode=True)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
- \xe2\xac\x86\xef\xb8\x8f\n
Run Code Online (Sandbox Code Playgroud)\n