如何防止 Python JSON .dumps() 函数删除回车符?[复制]

How to prevent Python JSON .dumps() function from removing carriage return? [duplicate]

提问人:cam.b 提问时间:9/12/2023 最后编辑:cam.b 更新时间:9/12/2023 访问量:105

问:

这个问题在这里已经有答案了:
2个月前关闭。

这篇文章是 2 个月前编辑并提交审核的,但未能重新打开帖子:

原始关闭原因未解决

在 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()

python json 行尾

评论

2赞 roganjosh 9/12/2023
为什么需要保留回车表?我什至不确定这是JSON规范的一部分
4赞 Mark 9/12/2023
JSON是一种数据交换格式。不是数据的一部分。如果你在文件中需要回车符,你通常最好在保存时指示它(例如,将参数传递给 open())。\r newline
2赞 Karl Knechtel 9/12/2023
您无法保留回车符,因为它们在解析过程中必然会丢失,因为它们不携带 JSON 格式的语义信息。但是,您可以选择在输出文件时是否输出回车符和换行符(也可以选择将其全部放在一行上) - 通过配置文件对象而不是调用。请参阅链接的副本。json.dumps
0赞 cam.b 9/12/2023
在上面的编辑中总结了我的想法,但听起来这个包并不是真的要以这种方式使用,JSON 规范也没有对格式化做出任何承诺(有意义)。很明显,我现在的问题出在哪里。感谢您的澄清!

答:

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 组件对文件进行一些处理后,对文件的字节级信息进行哈希处理,这就是我所追求的。应该说得更清楚,我很抱歉!