跳转到主要内容

解析/序列化任何标记格式

项目描述

Build Status Code Health Coverage

解析或序列化任何标记。目前支持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 识别基本类型 - NoneTypeintfloatbool(以及 Python 2 中的 long)并将所有值转换为这些类型。如果你想将所有内容都作为字符串获取,只需在 parseparse_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 使用

关于 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 (7.7 kB 查看哈希值)

上传时间

由以下组织支持