【问题标题】:How to explicitly set carriage return when doing json.dump?执行json.dump时如何显式设置回车?
【发布时间】:2017-01-25 13:18:58
【问题描述】:

我的 python 脚本生成 json 文件。而且我必须支持这个在 windows 和 linux 上工作的 python 文件。问题是windows和linux上的不同回车。当我在 Windows 上运行此代码时,它会输出 CRLF json。当我在 linux 上运行它时,它会输出 LF json。

那么在python3.5中做json dump时如何显式设置回车呢?我可以

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 的软件应该能够处理以某种方式结束的不熟悉的行。
  • 在 JSON 空白字符中,包括 \n\r,在令牌之外被忽略,在令牌内部不允许(空格除外)。所以使用 Windows 或 UNIX 换行并没有什么不同。

标签: python json linux python-3.x carriage-return


【解决方案1】:

如果您坚持一致的 CRLF 行为(JSON 规范要求解析器同时处理这两种行为,但在某些纯文本阅读器(如记事本)中打开它可能更容易使用一致的 CRLF),解决方案在the open function,而不是@987654323 @模块。

只需将newline='\r\n' 传递给open,它就会在所有系统上无缝地将json 编写的任何\n 转换为\r\n,而不是转换为os.linesep 的默认行为(即@在 Windows 上为 987654330@,在大多数其他操作系统上为 \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)

【讨论】:

  • 确实!我想设置 LF,所以我可以用 newline='\n\' 来实现
  • @jef:啊,你的问题听起来像你想要回车。是的,如果您只想要换行,请使用newline=''newline='\n',其中任何一个都禁用行尾翻译(后者明确表示“将 LF 转换为 LF”,前者表示“不翻译”,但那些是逻辑上等价的行为)。
  • 我确实想要 CR,所以谢谢你。尽管“JSON 规范需要解析器来处理两者”,但让 JSON 文件人类可读通常是有利的,这为我解决了这个问题。还解决了我在使用“智能引号”时遇到的问题
【解决方案2】:

行尾是 json 规范中的空白(https://www.rfc-editor.org/rfc/rfc7159 底部的第 2 节):

在这六个中的任何一个之前或之后都允许有无关紧要的空格 结构特征。

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

意味着每个阅读器都必须同时处理 CR 和 LF 以保持一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多