You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止Python JSON.dumps()函数移除回车符?

问题描述

我在Python中读取JSON文件,修改其中某个值后,调用json.dumps()处理返回的字符串,却发现字符串里的\r字符被移除了。保留原始格式对我的应用至关重要,但官方文档中没有指定换行符的相关方法,我找不到问题根源。有没有无需强行修改输出(比如替换字符、写入新文件等)就能保留换行符的方法?

示例代码如下:

with open('./test.json', 'rb') as test_file:
   for line in test_file:
      print(line)
      # 输出内容类似:
      # 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))
   # 输出结果:
   # '{\n   "yay": "JSON!"\n}'
   #    ^\r已被移除       ^\r已被移除

补充说明:针对类似问题,我希望无需修改原文件或写入新文件,让dumps()返回的字符串保留原文件的换行符。但根据相关信息,JSON包仅负责传递JSON数据,不保证格式保留,难道只能通过写入新文件或自行处理字符串格式来实现吗?


解决方案

首先明确:Python标准库的json模块在执行序列化(dumps)时,默认会将换行符标准化为\n,不会保留原文件中的\r\n。这是模块的设计逻辑——它只关注JSON数据的正确性,不会留存原文件的格式细节(比如换行符类型、自定义缩进风格等)。

你想要完全不修改输出就保留原换行符的方法是不存在的,因为json.load在读取文件时已经丢弃了所有格式信息,只解析出JSON的数据结构,原文件的换行符这类格式属性不会被存储到json_object中。

如果一定要匹配原文件的换行符,有两种可行思路:

  • 方法一:识别原换行符后手动替换
    先读取原文件内容,判断其使用的换行符类型,再对dumps的结果进行替换,全程无需写入新文件:
    # 第一步:识别原文件的换行符类型
    with open('./test.json', 'rb') as f:
        content = f.read()
        newline = '\r\n' if b'\r\n' in content else '\n'
    
    # 第二步:处理JSON并替换换行符
    with open('./test.json', 'rb') as test_file:
        json_object = json.load(test_file)
        json_dump = json.dumps(json_object, indent=3)
        # 将标准换行符替换为原文件的换行符
        json_dump = json_dump.replace('\n', newline)
        print(repr(json_dump))
    
  • 方法二:使用第三方格式保留库
    若需要频繁处理这类需保留原始格式的JSON,可以尝试第三方库(如json5、demjson),部分库支持在序列化时保留原文件的格式特征,但这类库的性能通常不如标准库。

内容的提问来源于stack exchange,提问作者cam.b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:35:23