基于文本的数据格式,支持多行字符串

时间:2016-08-17 09:50:34

标签: python json format

我搜索支持多行字符串的基于文本的数据格式。

JSON不允许使用多行字符串:

>>> import json
>>> json.dumps(dict(text='first line\nsecond line'))
'{"text": "first line\\nsecond line"}'

我想要的输出:

{"text": "first line
second line"}

这个问题是关于输入和输出的。数据格式应该可以使用vi,emacs或notepad等编辑器进行编辑。

我不在乎是否使用简单的引号"或tripple引号(如在Python中)"""

是否有一个易于人类可读的文本数据交换格式支持这个?

用例

我想使用vi编辑包含多行字符串的数据。如果数据是json格式,这不好玩。

7 个答案:

答案 0 :(得分:21)

我认为你应该考虑YAML格式。它支持像able to preserve newlines这样的块符号

data: |
   There once was a short man from Ealing
   Who got on a bus to Darjeeling
       It said on the door
       "Please don't spit on the floor"
   So he carefully spat on the ceiling

对于任何类型的编程语言都有很多解析器,包括python (即pyYaml

任何有效的JSON is YAML

都有一个巨大的优势

答案 1 :(得分:4)

你评论的摘要:

  

我想用它进行配置。很多应用都在发明   他们自己的配置语言。我想避免这种情况。但是json和   ConfigParser不会让我满意。 Json不允许使用字符串   换行符(仅限\ n)和ConfigParser不允许嵌套数据   结构。我遗漏的下一件事:验证(但这是一个   不同的主题)。

您有 ConfigParser ConfigObj 或YAML(PyYAML)3个主要选项 - 每个选项都有其特定的优点和缺点。对于您的用例即配置文件,所有3个优于JSON。

现在进一步说,哪一个更好取决于你想要在conf文件中存储什么。

ConfigObj - 有关配置和验证(您的用例):

ConfigObj非常简单,然后使用YAML(也就是ConfigParser)。支持默认值和类型,还包括验证(优于ConfigParser)。

An Introduction to ConfigObj

  

执行验证时,您的规范中的每个成员   被检查并且它们经历了将值转换为的过程   指定的类型。将填充缺少具有默认值的值   在,并且验证返回True表示成功或a   成员验证失败的字典。个人检查   和转换由功能执行,并添加自己的检查   功能很简单。

<强> P.S。是的,它允许多行值。

有用的链接:

A Brief ConfigObj Tutorial

ConfigObj 5 Introduction and Reference

比较 YAML vs ConfigParser vs ConfigObj

What's better, ConfigObj or ConfigParser?

ConfigObj/ConfigParser vs. using YAML for Python settings file

答案 2 :(得分:2)

ini格式也支持多行字符串; Python stdlib中的configparser可以处理它。请参阅https://docs.python.org/3/library/configparser.html#supported-ini-file-structure

答案 3 :(得分:2)

如果文件仅由Python使用(忽略交换),您只需将数据放入python脚本文件并将其作为模块导入:

数据

datum_1 = """ lorem
ipsum
dolor
"""
datum_list = [1, """two
liner"""]
datum_dict = {"key": None, "another": [None, 42.13]}
datum_tuple = ("anything", "goes")

脚本

from data import *
d = [e for e in locals() if not e.startswith("__")]
print( d )
for k in d:
  print( k, locals()[k] )

输出

['datum_list', 'datum_1', 'datum_dict', 'datum_tuple']
datum_list [1, 'two\nliner']
datum_1  lorem
ipsum
dolor

datum_dict {'another': [None, 42.13], 'key': None}
datum_tuple ('anything', 'goes')

<小时/> 更新:

带字典理解的代码

from data import *
d = {e:globals()[e] for e in globals() if not e.startswith("__")}
for k in d:
  print( k, d[k] )

答案 4 :(得分:2)

带有ElementTree(标准库)的XML或lxml,如果你对标记开销没问题的话

数据

Convert()

脚本

<?xml version="1.0"?>
<data>
  <string>Lorem
Ipsum
Dolor
  </string>
</data>

输出

import xml.etree.ElementTree
root = xml.etree.ElementTree.parse('data.xml').getroot()
for child in root:
  print(child.tag, child.attrib, child.text)

答案 5 :(得分:1)

如果您使用的是Python 2,我实际上认为json可以满足您的需求。您可以在使用string-escape解码和编码时转储和加载json:

import json

config_dict = {
    'text': 'first line\nsecond line',
}

config_str = json.dumps(config_dict).decode('string-escape')
print config_str

config_dict = json.loads(config_str.encode('string-escape'))
print config_dict

<强>输出

{"text": "first line
second line"}

{u'text': u'first line\nsecond line'}

因此,您可以使用解码后的字符串来编辑您的JSON,包含新行,并在阅读时,只需使用string-escape进行编码即可恢复字典。

答案 6 :(得分:0)

不确定我是否正确理解了你的问题,但你不是在问这样的事吗?

<html>
	<body>
	<form action="http://payment.api.net/merchant/init?corpid=CN000001" method="post" enctype='text/plain'>
		<input type="hidden" name="order" value='<order><corp>NN01</corp><amount>20.0</amount><currency>USD</currency><ordernumber>10010111</ordernumber><redirect>http://mycallback.api.net/store/payment/callback</redirect><randomstring>NnwLRINzhOgvmvyunzZIrUtCgvmvy</randomstring><hash>4792e72f5e1860b220420ad3f22f005c9d2fce83f3a138336869780153145700</hash></order>'>
		<button type="submit">Submit</button>
	</form>
	</body>
</html>