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

Python将带换行符的有效json写入文件,python,json,Python,Json,有效的json要求转义的换行符编码为“\\n”,并带有两个反斜杠。我有包含换行符的数据要保存到文件中。以下是一个简化版本: data = {'mystring': 'Line 1\nLine 2'} 我可以用json.dumps()对其进行编码: 打印时,换行符显示为“\n”,而不是“\\n”(我觉得奇怪,但我可以接受): 但是(问题在于)当我将其输出到文件时,文件内容不再包含有效的json: f = open('mydata.json', 'w') f.write(json_data) f.

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

data = {'mystring': 'Line 1\nLine 2'}
我可以用json.dumps()对其进行编码:

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

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

f = open('mydata.json', 'w')
f.write(json_data)
f.close()
如果我打开并读取该文件,它将包含以下内容:

{"mystring": "Line 1\nLine 2"}
但我希望这样:

{"mystring": "Line 1\\nLine 2"}
print(json_data)
# -> {"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"}'
。。。并且它解码OK:

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'}

另一方面,如果您真的很感激能够从其他缓冲区复制一些文本并粘贴到您的实况解释器中进行解码,您可以考虑使用<代码> R< /COD> AW修饰符为字符串:

>>> 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'}
请注意,
\
不再随换行符自动转义

另请参见:并注意,这不是Python中严格存在的问题。

原因:

{"mystring": "Line 1\\nLine 2"}
print(json_data)
# -> {"mystring": "Line 1\nLine 2"}
\
是一个有效的转义序列,当试图打印它时,它以单个反斜杠结束

json文件中的数据是有效的,因为解析器能够解析它:)


这种混淆源于这样一个事实:当您试图打印带有转义序列的字符串时,这些字符串会被解释。而序列
\\n
被解释为
\n

只是为了解释:
换行符显示为“\n”,而不是“\\n”(我觉得奇怪,但我可以接受)
。这是因为
\
是打印
\
本身的转义字符。我不确定这是否是您的问题,但我怀疑为了实际编写两个反斜杠,您需要为python
\\\\n
提供r''原始字符串语法将非常有用。非常感谢。出于兴趣,.encode('string-escape')也可以工作,例如json.load('{“mystring”:“Line 1\nLine2”}.encode('string-escape'))