分析/序列化任何标记格式
anymarkup的Python项目详细描述
分析或序列化任何标记。目前支持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 vs toml:这两个看起来几乎相同,实际上有共同的子集(其中, 但是,会产生不同的解析结果)。正因为如此,任何有类似INI的东西 将使用ini解析器解析外观。如果要将输入字符串解析为toml, 必须使用format=toml显式指定(请参见下面的示例)。
- json与json5:json5是json的超集,但应用并不广泛。因为实用性 对于json的使用,所有看起来像json的内容都被解析为json。如果需要输入字符串 要解析为json5,必须使用format=json5显式指定。
使用anymarkup.parse_file(path)时,任何标记都将尝试根据文件猜测格式 然后回到前面解释的猜测。这意味着如果文件 .tomlpr.json5扩展,您不必显式地提供format=<format>。
关于分析基本类型的说明
解析时,anymarkup识别基本类型-NoneType、int、float和bool (和python 2上的long)并将所有值转换为这些类型。如果你想得到 一切都是字符串,只需将force_types=False与parse或parse_file一起使用。最后, 您还可以使用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}
cli
要安装cli,请运行以下命令:
pip install anymarkup
从json到xml的转换示例:
anymarkup convert –from-format json –to-format xml <somefile.json
有关cli的完整帮助,请运行以下命令:
anymarkup –help anymarkup convert –help
后端
anymarkup使用:
有关订购信息的说明
分析某些类型的标记可以得到python的OrderedDict类型,即 XML文档和yaml!!omap(请参见http://yaml.org/type/omap.html)。anymarkup 处理此问题没有问题,但请注意,如果将它们序列化为json或ini 然后再次解析,您将丢失排序信息(这意味着您将得到 dict返回)。
这是因为json和ini解析器(据我所知)不考虑 排序键值结构很重要,但没有直接的方法 表示排序键值结构的标记语言。
依赖关系注释
如果您只需要支持的子集的任何标记功能,请阅读本节 无需安装所有解析器的标记语言。
自0.5.0版以来,anymarkup只是围绕anymarkup核心的包装库 (https://github.com/bkabrda/anymarkup-core)并且实际上不包含任何代码, 除了从任何标记核心导入。
anymarkup的核心目标是不显式地依赖于任何解析器,因此 只能使用指定的依赖项子集安装它。例如,您可以 如果您知道只解析yaml,请仅使用pyyaml安装anymarkup core。
如果安装了任何标记,您将始终获得一组完整的依赖项 您将能够解析任何受支持的标记语言。
cli需要按requirements.txt文件中的指示单击。
示例
解析示例:
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')