我搜索支持多行字符串的基于文本的数据格式。
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格式,这不好玩。
答案 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)。
执行验证时,您的规范中的每个成员 被检查并且它们经历了将值转换为的过程 指定的类型。将填充缺少具有默认值的值 在,并且验证返回True表示成功或a 成员验证失败的字典。个人检查 和转换由功能执行,并添加自己的检查 功能很简单。
<强> P.S。是的,它允许多行值。
有用的链接:
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>