gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:01:44 27 4
gpt4 key购买 nike

有效的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com