提问人:cam.b 提问时间:9/12/2023 最后编辑:cam.b 更新时间:9/12/2023 访问量:105
如何防止 Python JSON .dumps() 函数删除回车符?[复制]
How to prevent Python JSON .dumps() function from removing carriage return? [duplicate]
问:
在 Python 中,我尝试读取 JSON 文件,更改单个值,然后对函数返回的字符串进行一些进一步的处理。但是,在调用返回的字符串后,删除了字符。.dumps()
json.dumps()
/r
对于我的应用程序来说,保持原始格式很重要。json.dumps() 的文档没有指定行尾的方法。我看不出还有什么可能导致这种删除。
我是做错了什么,还是有没有办法在不强制输出的情况下维护行尾(即替换、写入具有正确行尾的新文件等)?
举个简单的例子:
with open('./test.json', 'rb') as test_file:
for line in test_file:
print(line)
# This prints lines that look like:
# b'{\r\n'
# b' "yay": "JSON!"\r\n'
# b'}'
test_file.seek(0,0)
json_object = json.load(test_file)
json_dump = json.dumps(json_object, indent=3)
print(repr(json_dump))
# This prints:
# '{\n "yay": "JSON!"\n}'
# ^\r removed ^\r removed
编辑
澄清这种可能的重复。我希望我可以在不修改现有文件或写入新文件的情况下做到这一点。换句话说,我希望返回的字符串保持与文件相同的行尾。但是,感谢下面的有用评论。我看到这真的不是JSON包的意图。JSON 包仅传输 JSON 数据,不对格式做出任何承诺。听起来要得到我想要的东西,我需要写入一个新文件或自己做一些字符串格式化。谢谢大家!.dumps()
答:
1赞
Chris
9/12/2023
#1
而不必强行控制输出(即替换、写入具有正确行尾的新文件等)?
这没什么大不了的:你可以指定打开输出文件时要使用的换行符:
with open("test.json", "w", newline="\r\n") as f:
f.write('{\n "yay": "JSON!"\n}')
将输出写入流时,如果换行符为 ,则写入的任何字符都将转换为系统默认行分隔符
os.linesep
。如果换行符为 或 ,则不进行转换。如果换行符是任何其他合法值,则写入的任何字符都将转换为给定的字符串。None
'\n'
''
'\n'
'\n'
如果您要写回源文件,这也应该有效:
with open("test.json", "r+", newline="\r\n") as f:
my_dict = json.loads(f.read())
f.seek(0)
f.write(json.dumps(my_dict, indent=3))
评论
0赞
cam.b
9/12/2023
感谢您的代码片段。我现在意识到我的问题听起来与这里提出的问题相似。就我而言,我希望不需要使用另一个文件,但听起来我需要使用另一个文件来使用您的建议,这似乎是目前阻力最小的路径。谢谢!
0赞
Chris
9/12/2023
@cam.b,如果您不写回文件,为什么是否有回车很重要?这听起来确实像是你想把这些数据写回去。我知道您之后还有另一个过程来读取此数据。
0赞
cam.b
9/13/2023
在通过 JSON 组件对文件进行一些处理后,对文件的字节级信息进行哈希处理,这就是我所追求的。应该说得更清楚,我很抱歉!
评论
\r
newline
json.dumps