如何防止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
相关产品推荐
相关产品推荐

