解析/序列化任何标记格式
项目描述
解析或序列化任何标记。目前支持ini, json, json5, toml, xml和yaml。在https://github.com/bkabrda/anymarkup/issues报告错误和新的功能请求。
解析
>>> import anymarkup >>> anymarkup.parse('foo: bar') {'foo': 'bar'} >>> anymarkup.parse_file('foo/bar.ini') {'section': {'subsection': {'opt2': 'bar'}, 'opt1': 'foo'}} $ cat foo/bar.ini [section] opt1=foo [[subsection]] opt2=bar
序列化
>>> import anymarkup >>> anymarkup.serialize({'foo': 'bar'}, 'json') b'{\n "foo": "bar"\n}' >>> anymarkup.serialize_file({'foo': 'bar'}, 'foo/bar.json') $ cat foo/bar.json { "foo": "bar" }
anymarkup遵循BSD许可证。您可以从https://pypi.python.org/pypi/anymarkup下载官方版本,或者通过pip install anymarkup安装。
anymarkup与Python 2.7和>= 3.3兼容。
自动标记语言识别
当使用 anymarkup.parse(input) 时,anymarkup 将尝试猜测输入的标记语言。这通常工作得很好,除了
ini 与 toml:这两个看起来几乎一样,实际上有共同的子集(然而,这会导致不同的解析结果)。因此,任何看起来像 ini 的内容都将使用 ini 解析器进行解析。如果你想让输入字符串被解析为 toml,你必须显式地使用 format=toml(下面有示例)。
json 与 json5:json5 是 json 的超集,但并不广泛使用。由于 json 的实用性,任何看起来像 json 的内容都将被解析为 json。如果你想让输入字符串被解析为 json5,你必须显式地使用 format=json5。
当使用 anymarkup.parse_file(path) 时,anymarkup 将根据文件扩展名尝试猜测格式,然后回退到上面的猜测方式。这意味着如果文件具有 .toml 或 .json5 扩展名,你不需要显式提供 format=<format>。
关于解析基本类型的说明
在解析时,anymarkup 识别基本类型 - NoneType、int、float 和 bool(以及 Python 2 中的 long)并将所有值转换为这些类型。如果你想将所有内容都作为字符串获取,只需在 parse 或 parse_file 中使用 force_types=False。最后,你也可以使用 force_types=None 来获取解析后端返回的内容。
>>> anymarkup.parse('a: 1') {'a': 1} >>> anymarkup.parse('a: 1', force_types=False) {'a': '1'} >>> anymarkup.parse('a: 1', force_types=None) {'a': 1}
命令行界面
要安装命令行界面,请运行以下命令
pip安装anymarkup
从 JSON 转换到 XML 的示例
anymarkup convert –from-format json –to-format xml <somefile.json
要获取 CLI 的完整帮助,请运行以下命令
anymarkup –help anymarkup convert –help
后端
anymarkup 使用
https://pypi.python.org/pypi/configobj/ 进行 ini 解析
https://docs.pythonlang.cn/library/json.html 进行 json 解析
https://pypi.python.org/pypi/toml/ 进行 toml 解析
https://pypi.python.org/pypi/xmltodict 进行 xml 解析
https://pypi.python.org/pypi/PyYAML 进行 yaml 解析
关于 OrderedDict 的说明
解析某些类型的标记可能会产生 Python 的 OrderedDict 类型 - 也就是说 XML 文档和 YAML !!omap(见 http://yaml.org/type/omap.html)。anymarkup 可以无问题地处理这种情况,但请注意,如果你将这些内容序列化为 JSON 或 INI 并再次解析,你将丢失顺序信息(这意味着你将只得到 dict)。
这是因为据我所知,JSON 和 INI 解析器不认为顺序键值结构很重要,而且在这些标记语言中没有直接的方式来表达顺序键值结构。
关于依赖的说明
如果你只想使用支持标记语言的子集,而不需要安装所有解析器,请阅读本节。
从版本 0.5.0 开始,anymarkup 仅仅是 anymarkup-core (https://github.com/bkabrda/anymarkup-core) 的包装库,实际上不包含任何代码,除了从 anymarkup-core 导入的代码。
anymarkup-core 的目标是不要显式依赖于任何解析器,这样人们就可以只安装指定的依赖子集。例如,如果你知道你将只解析 YAML,你可以仅使用 PyYAML 安装 anymarkup-core。
如果您安装anymarkup,您将始终获得完整的依赖项集合,并且您将能够解析任何受支持的标记语言。
根据requirements.txt文件的要求,CLI需要click。
示例
解析示例
ini = """ [a] foo = bar""" json = """ {"a": { "foo": "bar" }}""" xml = """<?xml version="1.0" encoding="UTF-8"?> <a> <foo>bar</foo> </a>""" yaml = """ a: foo: bar """ # these will all yield the same value (except that xml parsing will yield OrderedDict) anymarkup.parse(ini) anymarkup.parse(json) anymarkup.parse(xml) anymarkup.parse(yaml) # explicitly specify a type of format to expect and/or encoding (utf-8 is default) anymarkup.parse('foo: bar', format='yaml', encoding='ascii') # by default, anymarkup recognizes basic types (None, booleans, ints and floats) # if you want to get everything as strings, just use force_types=False # will yield {'a': 1, 'b': True, 'c': None} anymarkup.parse('a: 1\nb: True\nc: None') # will yield {'a': '1', 'b': 'True', 'c': 'None'} anymarkup.parse('a: 1\nb: True\nc: None', force_types=False) # or parse a file anymarkup.parse_file('foo.ini') # if a file doesn't have a format extension, pass it explicitly anymarkup.parse_file('foo', format='json') # you can also pass encoding explicitly (utf-8 is default) anymarkup.parse_file('bar', format='xml', encoding='ascii')
序列化示例
struct = {'a': ['b', 'c']} for fmt in ['ini', 'json', 'xml', 'yaml']: # any of the above formats can be used for serializing anymarkup.serialize(struct, fmt) # explicitly specify encoding (utf-8 is default) anymarkup.serialize(struct, 'json', encoding='utf-8') # or serialize directly to a file anymarkup.serialize_file(struct, 'foo/bar.ini') # if a file doesn't have a format extension, pass it explicitly anymarkup.serialize_file(struct, 'foo/bar', format='json') # you can also pass encoding explicitly (utf-8 is default) anymarkup.serialize_file(struct, 'foo/bar', format='json', encoding='ascii')
项目详情
anymarkup-0.8.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d125c795bd47c5f7dd5ec6aedd0691f7aa7b9ed619fde87eb56ddff17ee3e844 |
|
MD5 | 25dc3d226bcbcce6d557ad20887238cf |
|
BLAKE2b-256 | 23cd33df5e9ce5dcf72a55e39432a0d6bbc77aa7857b536a063c368aa48bdd8f |