一个优雅的字典和json处理程序

dictor的Python项目详细描述


听写器-字典医生

一个优雅的字典和json处理程序

0.1.2版

dictor是一个与python 2和3兼容的json/字典处理程序。

dictor获取字典或json数据并返回特定键的值。

如果dictor找不到键的值,或者json或dictionary数据缺少键,则返回值为none或您提供的任何回退值。

dictor很有礼貌,在解析大型字典/json时通常会遇到异常错误。

使用DISTROR消除了在处理大型JSON结构的查找时重复使用代码中的TIV/BULD块,并提供了在丢失的键/值上插入回退值的灵活性。


安装

pip install dictor

用法

sample.json

{
    "characters": {
        "Lonestar": {
            "id": 55923,
            "role": "renegade",
            "items": [
                "space winnebago",
                "leather jacket"
            ]
        },
        "Barfolomew": {
            "id": 55924,
            "role": "mawg",
            "items": [
                "peanut butter jar",
                "waggy tail"
            ]
        },
        "Dark Helmet": {
            "id": 99999,
            "role": "Good is dumb",
            "items": [
                "Shwartz",
                "helmet"
            ]
        },
        "Skroob": {
            "id": 12345,
            "role": "Spaceballs CEO",
            "items": [
                "luggage"
            ]
        }
    }
}

现在让我们获取所有字符的信息

from dictor import dictor

with open('sample.json') as data: 
    data = json.load(data)

print(dictor(data, 'characters'))

{u'Lonestar': {u'items': [u'space winnebago', u'leather jacket'], u'role': u'renegade', u'id': 55923}, u'Dark Helmet': {u'items': [u'Shwartz', u'helmet'], u'role': u'Good is dumb', u'id': 99999}, u'Barfolomew': {u'items': [u'peanut butter jar', u'waggy tail'], u'role': u'mawg', u'id': 55924}, u'Skroob': {u'items': [u'luggage'], u'role': u'Spaceballs CEO', u'id': 12345}}

获取深色头盔的详细信息

print(dictor(data, 'characters.Dark Helmet.items'))

[u'Shwartz', u'helmet']

您还可以传递一个标志来忽略字母的上/下大小写,

print(dictor(data, 'characters.dark helmet.items', ignorecase=True))

仅获取字符的第一项

print(dictor(data, 'characters.Dark Helmet.items.0'))

Shwartz

回退值和错误处理

默认情况下,如果字典不包含您的搜索路径,dictor将返回none,

print(dictor(data, 'characters.Princess Leia'))

None

您可以通过传递 default=“回退值”或只放置回退字符串,

print(dictor(data, 'characters.Princess Leia', default='Not in Spaceballs'))

Not in spaceballs

或者添加一个备用字符串,

print(dictor(data, 'characters.Princess Leia', 'fallback to this'))

fallback to this

如果您想在none值上出错,只需提供checknone标志,就会引发value error。

print(dictor(data, 'characters.Princess Leia', checknone=True))

Traceback (most recent call last):
  File "test.py", line 14, in <module>
    print(dictor(data, 'characters.Princess Leia', checknone=True))
  File "/github.com/dictor/dictor/__init__.py", line 77, in dictor
    raise ValueError('missing value for %s' % path)
ValueError: value not found for search path: "characters.Princess Leia"

将变量传递到搜索路径

如果需要将变量传递到搜索路径中

who = "Barfolomew"
print(dictor(data, "characters.{}.id".format(who)))

55924

如果使用python 3,还可以使用f字符串

who = "Barfolomew"
print(dictor(data, f"characters.{who}.id"))

听写列表

如果整个json结构是一个列表

[
 {
  "color": "red",
  "value": "#f00"
 },
 {
  "color": "green",
  "value": "#0f0"
 },
 {
  "color": "blue",
  "value": "#00f"
 }
]

只需在搜索路径中提供列表索引

print(dictor(data, ‘2.color’))

blue

列表的嵌套列表

要解析列表和dict的复杂嵌套列表,只需在搜索路径中提供列表索引

[
    {
        "type": "json",
        "message": [
            [
                {
                    "english": "apple",
                    "spanish": "manzana"
                },
                {
                    "english": "banana",
                    "spanish": "platano"
                }
            ],
            [
                {
                    "english": "cherry",
                    "spanish": "cereza"
                },
                {
                    "english": "durian",
                    "spanish": "durian",
                    "color": [
                        "black",
                        "brown",
                        "orange"
                    ]
                }
            ]
        ]
    }
]

dictor将按层次结构分析每个查找元素,从top开始,一直到最后一个元素,读取每个点分隔的列表索引。

print(dictor(data, '0.message.1.1.color.2'))

orange

使用点处理关键查找

如果需要查找键名中有点的键值,例如

{
    "dirty.harry": {
        "year": 1977,
        "genre": "romance"
    },
}

搜索dictor(data,'dirty.harry')将返回none,因为dictor将点分隔的条目视为两个单独的键。

要搜索包含点的键,只需使用转义字符“\”,

dictor(data, 'dirty\.harry')

{u'genre': u'romance', u'year': 1977}

测试

测试使用python nose完成。测试位于“tests”目录中。

pip install nose

shell> nosetests test.py

发行说明

0.1.2

  • 修复了查找错误

0.1.1

  • 删除了“eval()”功能以增加安全性

  • 整个查找引擎被重写,以提高速度和简化

  • 添加了“ignorecase”参数

  • 为带有点的键添加了转义点字符的功能

  • 查找列表索引已修改,

    在以前的版本中,查找元素的方式如下所示,

    dictor(data, 'characters.Dark Helmet.items[0]')
    

    新的语法是将所有内容放置为点分隔的路径,这创建了一个单一的查找标准,即

    dictor(data, 'characters.Dark Helmet.items.0')
    

0.0.1

  • 初始项目发布

贡献者

  • 迈克·里德(愿施瓦茨一家与您同在)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript生成两点之间的固定纬度和经度   java为什么不删除并重命名文件?   求数组的和   java在漂亮面孔中使用正则表达式   SOAP(java)中的Hello World。如何修复它?   java I获取应用程序生成错误,配置为“”的资源“attr/arc_position”的值重复   云基础环境中的Java SFTP客户端应用   谷歌应用程序引擎Java查询日期不正常?   java使用cancel按钮对JOptionPane InputDialog循环进行转义   java数字格式总是返回异常   xquery Java Saxon API以“追加”模式写入文件   java Azure函数在第二个插槽中没有响应   java在构建Play应用程序后向其添加动态依赖项   json如何使用Jackson mapper for java。木卫一。可序列化类型字段?