Python 将带有换行符的有效 json 写入文件

您所在的位置:网站首页 json写入文件后再读取出现换行符怎么回事 Python 将带有换行符的有效 json 写入文件

Python 将带有换行符的有效 json 写入文件

2024-05-15 23:55| 来源: 网络整理| 查看: 265

有效的 json 期望转义的换行符被编码为“\\n”,带有两个反斜杠。我有包含要保存到文件中的换行符的数据。这是一个简化版本:

data = {'mystring': 'Line 1\nLine 2'}

我可以用 json.dumps() 对其进行编码:

import json json_data = json.dumps(data) json_data # -> '{"mystring": "Line 1\\nLine 2"}'

当我打印它时,换行符显示为“\n”,而不是“\\n”(我觉得这很奇怪,但我可以接受):

print(json_data) # -> {"mystring": "Line 1\nLine 2"}

但是(问题出在这里)当我将它输出到文件时,文件的内容不再包含有效的 json:

f = open('mydata.json', 'w') f.write(json_data) f.close()

如果我打开文件并阅读它,它包含以下内容:

{"mystring": "Line 1\nLine 2"}

但我希望这样:

{"mystring": "Line 1\\nLine 2"}

奇怪的是(我认为),如果我使用 python 的 open() 读取文件,则 json 数据被认为是有效的:

f = open('mydata.json', 'r') json_data = f.read() f.close() json_data # -> '{"mystring": "Line 1\\nLine 2"}'

... 并且解码正常:

json.loads(json_data) # -> {u'mystring': u'Line 1\nLine 2'}

我的问题是为什么文件中的数据不是有效的 json?如果我需要另一个 - 非 Python - 应用程序来读取它,它可能是不正确的。如果我复制并粘贴文件内容并在其上使用 json.loads() 它会失败:

import json json.loads('{"mystring": "Line 1\nLine 2"}') # -> ValueError: Invalid control character at: line 1 column 21 (char 20)

谁能解释这是预期的行为还是我做错了什么?

最佳答案

您遇到了忽略 \ 字符也是 Python 中的转义序列字符这一事实的陷阱。尝试打印出最后一个示例而不是调用 json.loads:

>>> print('{"mystring": "Line 1\nLine 2"}') {"mystring": "Line 1 Line 2"}

以上不可能是有效的 JSON。如果 \ 字符编码正确怎么办?

>>> print('{"mystring": "Line 1\\nLine 2"}') {"mystring": "Line 1\nLine 2"}

更好的是,您可以:

>>> json.loads('{"mystring": "Line 1\\nLine 2"}') {'mystring': 'Line 1\nLine 2'}

或者,如果您真的很高兴能够从其他缓冲区复制一些文本并将其粘贴到您的实时解释器中进行解码,您可以考虑为您的字符串使用 raw 修饰符:

>>> print(r'{"mystring": "Line 1\nLine 2"}') {"mystring": "Line 1\nLine 2"} >>> json.loads(r'{"mystring": "Line 1\nLine 2"}') {'mystring': 'Line 1\nLine 2'}

请注意 \ 不再使用换行符自动转义。

另见:How do I handle newlines in JSON?并注意这不是严格存在于 Python 中的问题。

关于Python 将带有换行符的有效 json 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31203259/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3