如何在进行json.dump时显式设置回车符?

9
我的Python脚本生成JSON文件。我需要支持在Windows和Linux上使用此Python文件。问题是Windows和Linux上的回车符不同。当我在Windows上运行此代码时,它输出CRLF JSON。当我在Linux上运行此代码时,它输出LF JSON。
那么如何在Python3.5中显式设置回车符以进行JSON转储?我无法...
import json
fpath = "hoge.json"
data = {"AGE": 12, "HOGE": [{"GUA": 3}]}
with open(fpath, 'wt', encoding="utf-8") as outfile:
    json.dump(data, outfile, indent=4, sort_keys=True, ensure_ascii=False)

http://docs.python.jp/3/library/json.html


最好在创建文件后单独转换行结束符。或者更好的方法是,只需使用支持行结束符的代码在另一端读取它;大多数读取JSON的软件都应该能够以某种方式处理不熟悉的行结束符。 - BrenBarn
在JSON中,空格字符包括\n\r在标记之外被忽略,在标记内除了空格之外都是不允许的。因此,在使用Windows或UNIX换行符时没有区别。 - Klaus D.
2个回答

13
如果你坚持要保持一致的CRLF行为(JSON规范要求解析器处理两者,但在像记事本这样的纯文本阅读器中打开可能更容易使用一致的CRLF),解决方案在于open函数而不是json模块。
只需向open传递newline='\r\n',它将在所有系统上无缝地将由json写入的任何\n转换为\r\n,而不是默认行为将其转换为os.linesep(在Windows上为\r\n,在大多数其他操作系统上为\n):
with open(fpath, 'w', encoding="utf-8", newline='\r\n') as outfile:
    json.dump(data, outfile, indent=4, sort_keys=True, ensure_ascii=False)

1
真的!我想设置LF,所以我可以通过newline='\n'实现它 - jef
1
@jef:啊,你的问题让人觉得你“想要”回车符。如果你只需要换行符,请使用newline=''newline='\n',两者都禁用了行尾转换(后者明确表示“将LF转换为LF”,前者表示“不要转换”,但这些在逻辑上是等效的行为)。 - ShadowRanger
我确实需要CR,所以谢谢你。虽然“JSON规范要求解析器处理两者”,但通常使JSON文件易读性更好,这对我很有帮助。还解决了我遇到的“智能引号”的问题。 - dumbledad

2

在Json规范中,换行符被视为空白字符(参见https://www.rfc-editor.org/rfc/rfc7159第2节底部):

Insignificant whitespace is allowed before or after any of the six structural characters.

  ws = *(
          %x20 /              ; Space
          %x09 /              ; Horizontal tab
          %x0A /              ; Line feed or New line
          %x0D )              ; Carriage return

这意味着每个读者都必须处理CR和LF以符合标准。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接