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

Python 支持多行字符串的基于文本的数据格式,python,json,format,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或记事本等编辑器进行编辑

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

JSON不允许多行字符串:

>>> import json
>>> json.dumps(dict(text='first line\nsecond line'))
'{"text": "first line\\nsecond line"}'
我的期望输出:

{"text": "first line
second line"}
这个问题是关于输入和输出的。数据格式应该可以使用vi、emacs或记事本等编辑器进行编辑

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

是否有一种易于人类阅读的文本数据交换格式支持这一点

用例
我想用
vi
编辑具有多行字符串的数据。这是不好玩的,如果数据是JSON格式。

< P>我想你应该考虑格式。它支持如下的块表示法

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(即python)


还有一个巨大的优势是,任何有效的。

ini
格式也支持多行字符串;Python stdlib中的configparser可以处理它。请参阅。

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

资料

剧本

from data import *
d = [e for e in locals() if not e.startswith("__")]
print( d )
for k in d:
  print( k, locals()[k] )
import xml.etree.ElementTree
root = xml.etree.ElementTree.parse('data.xml').getroot()
for child in root:
  print(child.tag, child.attrib, child.text)
输出

['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')
string {} Lorem
Ipsum
Dolor

更新:

带字典理解的代码

from data import *
d = {e:globals()[e] for e in globals() if not e.startswith("__")}
for k in d:
  print( k, d[k] )
XML(标准库),或者如果您对标记开销没有异议:

资料

输出

['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')
string {} Lorem
Ipsum
Dolor

关于你的评论:

我想用它来配置。许多应用程序发明了 他们自己的配置语言。我想避免这种情况。但是json和 我不满意。Json不允许带有 换行符(仅\n)和ConfigParser不允许嵌套数据 结构。我缺少的下一件事是:验证(但这是一个 不同主题)

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

现在进一步说,哪一个更好取决于您到底想在conf文件中存储什么


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

ConfigObj比YAML(也是ConfigParser)使用起来非常简单。支持默认值和类型,还包括验证(比ConfigParser有很大的优势)

执行验证时,规范中的每个成员 进行检查,并将值转换为 指定的类型。将填充缺少的具有默认值的值 在中,验证返回True表示成功,或返回 具有验证失败成员的字典。个人支票 和转换由函数执行,并添加您自己的检查 功能非常简单

p.S.是的,它允许多行值


有用链接:


比较YAMLvsConfigParservsConfigObj中有可靠的答案:

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

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



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

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

print my_config

如果您使用的是Python2,我实际上认为json可以满足您的需要。您可以在使用
字符串转义对json进行解码和编码时转储和加载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(包括换行符),读取时,只需使用字符串转义编码即可取回字典。

您可以详细说明数据格式/用途,即复杂结构或某些设置/配置文件等。@NabeelAhmed我想使用它进行配置。许多应用程序发明了自己的配置语言。我想避免这种情况。但是json和ConfigParser不能让我满意。Json不允许带换行符的字符串(仅\n),ConfigParser不允许嵌套数据结构。我缺少的下一件事是:验证(但这是一个不同的主题)。亲爱的Nabeel,如果缺少什么,请留下新的评论。我想如果你能替换dump result,那么结果应该是正确的
data=json.dumps(dict(text='first line\n second line'))data=data.replace('\\n','\n')print(data)
这是什么类型的数据格式?显示Python源代码。这已经是用户“handle”的答案了。@guettli哦,没错,我的观点与“handle”用户完全相同。