一、前言

  • 正常情况下,想访问字典中的某个值,都是通过中括号访问,比如:
test_dict = {"test": {"imdb stars": 6.7, "length": 104}}
print(test_dict["test"]["imdb stars"])
# 104
  • 而通过 Box 模块,可以扩展字典功能,使用点符号访问元素:
from box import Box
movie_box = Box({ "Robin Hood: Men in Tights": { "imdb stars": 6.7, "length": 104 }})
movie_box.Robin_Hood_Men_in_Tights.imdb_stars
# 6.7
  • 可以看到默认情况下转换后,字典键值中的空格被转化为下划线。
  • 安装依赖:
    • Windows 环境 打开 Cmd (开始-运行-CMD);
    • MacOS 环境 打开 Terminal (command + 空格输入Terminal);
    • 如果使用的是 VSCode编辑器或 Pycharm,可以直接使用界面下方的 Terminal:
pip install --upgrade python-box[all]

二、Box 的基本使用

① 生成 Box 并访问

  • 可以像上文中那样,传入一个字典给 Box,生成一个 Box 对象;也可以直接使用参数赋值的方式生成一个 Box 对象:
from box import Boxmy_box = Box(funny_movie='Hudson Hawk', best_movie='Kung Fu Panda')
my_box.funny_movie
# 'Hudson Hawk'
  • 请记住,任何情况下,往 Box 对象里添加字典或是数组,这些字典或数组都会被转变为 Box 对象:
my_box = Box({"team": {"red": {"leader": "Sarge", "members": []}}})
print(my_box.team.red.leader)
# Sargemy_box.team.blue = {"leader": "Church", "members": []}
print(repr(my_box.team.blue))
# <Box: {'leader': 'Church', 'members': []}>
  • 访问列表中的 Box 对象也非常轻松:
my_box.team.red.members = [{"name": "Grif", "rank": "Minor Junior Private Negative First Class"},{"name": "Dick Simmons", "rank": "Captain"}
]print(my_box.team.red.members[0].name)
# Grif

② 局限性

  • 字典中有些默认方法,如:clear, copy, fromkeys, get, items, keys, pop, popitem, setdefault, to_dict, update, merge_update, values ,当键值和这些方法名称冲突时,无法使用点符号访问它们。
  • 不过冲突时,依然可以使用传统的字典取值访问它们,例如:
my_box['keys']

③ 合并

  • 要合并两个 Box 对象,只需要通过 merge_update 方法:
from box import Boxbox_1 = Box(val={'important_key': 1})
box_2 = Box(val={'less_important_key': 2})box_1.merge_update(box_2)print(box_1)
# {'val': {'important_key': 1, 'less_important_key': 2}}
  • 当然,也可以用传统的 update 方法:
from box import Boxbox_1 = Box(val={'important_key': 1})
box_2 = Box(val={'less_important_key': 2})box_1.update(box_2)print(box_1)
# {'val': {'less_important_key': 2}}

④ 转换为原始列表/字典

  • 如果需要把一个 Box 对象的字典转化为原始字典,.to_dict() 方法就可以实现:
from box import Boxbox_1 = Box(val={'important_key': 1}) print(box_1)
# {'val': {'less_important_key': 2}}
print(type(box_1))
# <class 'box.box.Box'>
print(type(box_1.to_dict()))
# <class 'dict'>
  • 如果需要把一个 Box 对象的列表转化为原始列表,可以使用 .to_list() 方法:
from box import BoxListmy_boxlist = BoxList({'item': x} for x in range(10))
# <BoxList: [<Box: {'item': 0}>, <Box: {'item': 1}>, ...my_boxlist[5].item
# 5print(type(my_boxlist.to_list()))
# <class 'list'>

三、导入导出功能

  • Box 对象有一个很方便的功能,就是能够轻松地将 Box 对象导出为 Json / yaml / csv / msgpack 文件:
from box import BoxListmy_boxlist = BoxList({'item': x} for x in range(10))
# <BoxList: [<Box: {'item': 0}>, <Box: {'item': 1}>, ...my_boxlist.to_json(filename="test.json")
# 在当前文件夹下生成一个 test.json 文件
  • 此外,还能接受 Json / yaml / csv / msgpack 文件导入:
new_box = Box.from_json(filename="films.json")
  • 各种类型的文件对应的方法如下:
转换器方法 描述
to_dict 递归地将所有 Box(和 BoxList)对象转换回字典(和列表)
to_json 将 Box 对象另存为 JSON 字符串或使用filename参数写入文件
to_yaml 将 Box 对象另存为 YAML 字符串或使用filename参数写入文件
to_msgpack 将 Box 对象另存为 msgpack 字节或使用filename参数写入文件
to_toml* 将 Box 对象另存为 TOML 字符串或使用filename参数写入文件
to_csv** 将 BoxList 对象另存为 CSV 字符串或使用filename参数写入文件
from_json Classmethod,从一个 JSON 文件或字符串创建一个 Box 对象(所有 Box 参数都可以传递)
from_yaml 类方法,从 YAML 文件或字符串创建一个 Box 对象(所有 Box 参数都可以传递)
from_msgpack Classmethod,从msgpack文件或字节创建一个Box对象(所有Box参数都可以传递)
from_toml* Classmethod,从TOML文件或字符串创建一个Box对象(所有Box参数都可以传递)
from_csv** Classmethod,从一个CSV文件或字符串创建一个BoxList对象(可以传递所有BoxList参数)
  • 不适用于 BoxList,仅适用于 Box ** 不适用于 Box,仅适用于 BoxList。

Python之深入解析Box为字典添加高级点符号访问特性相关推荐

  1. 【python学习】如何将字典添加到字典

    文章目录 前言 一.update() 二.** 三.| 四.collections.ChainMap 总结 前言 在本教程中,我们将讨论在 Python 中将字典附加到另一个字典的不同方法. 一.up ...

  2. python把字符串放到列表_python中for循环把字符串或者字典添加到列表的方法

    python中如何for循环把字符串添加到列表? 实例: 1.单个字符串用for循环添加到列表中: # 把L1中的字符串添加到列表alist里面 L1 = 'MJlifeBlog' alist = [ ...

  3. python json数组解析_Python基础系列(一)搞懂json数据解析与字典之间的关系

    是不是一直傻傻分不清楚dumps.dump.loads和load的关系,长痛不如短痛,今天索性就把它写明白,不懂得朋友,请看下面. 这里我先回答一个很常见的问题,为什么 Python 会有四个操作 J ...

  4. python中字典添加键对_关于python:如何向字典添加键、值对?

    本问题已经有最佳答案,请猛点这里访问. 如何在字典中添加键.值对?.下面我提到了以下格式? {'1_somemessage': [[3L, 1L, u'AAA', 1689544L, datetime ...

  5. python学习-列表解析、字典解析

    文章目录 扩展链接 列表解析 字典解析 扩展链接 一些基础数据类型的博文链接: python学习-数据类型 列表 python学习-数据类型 字典 python学习-数据类型 元组 python学习- ...

  6. python 列表嵌套字典 添加修改删除_【Python】列表嵌套字典修改字典里面的一个值却把全部的值都修改了。...

    具体问题就是:当我往空列表里面添加字典,需要修改其中的一个键的值的时候,出现把其他同类的值也修改了. 下面就是出现问题的代码: aliens = [] new_alien = {"color ...

  7. py 字典添加多个value_# Python 3 # Python 3字典Dictionary(1)

    Python3 字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格 ...

  8. python字典添加数组_一步一步学Python3(小学生也适用) 第十三篇: 字典Dict类型

    前面我们已经学习了Python的字符串,列表,元组,这一篇我们将学习字典,字典的使用频率是非常高,跟前面几篇一样,只要你用Python编程,就避不开Python字典. 一.创建字典 字典由键(key) ...

  9. Python学习笔记:列表、字典与集合解析(List, Dict and Set Comprehensions)

    Python学习笔记:列表.字典与集合解析(List, Dict and Set Comprehensions) 1.列表解析 最受喜爱的Python语言特性.过滤一个集合的元素生成一个新的列表. 一 ...

最新文章

  1. before vue路由钩子_vue组件级路由钩子函数介绍,及实际应用
  2. iOS系类教程之用instruments来检验你的app
  3. poj 1190(剪枝)
  4. 0220互联网新闻 | 豆瓣FM获腾讯音乐娱乐集团投资;华为云将在新加坡拓展云平台和人工智能能力...
  5. combobox 怎么实现对listview的类别查询_Flutter实战之独立实现官网Demo单词收藏Demo
  6. Android之UI线程与子线程交互设计的5种方法
  7. Python 两个list获取交集,并集,差集的方法(合并、交叉)
  8. js 把对象按照属性名的字母顺序进行排列
  9. linux安装tomcat后启动报错Cannot find ./catalina.sh的解决方法
  10. ubuntu修改服务器端,修改ubuntu 服务器配置
  11. nodejs 端口被占解决
  12. 设计模式之GOF23观察者模式
  13. jwplayer播放器初探
  14. php实现室内地图导航,概述-室内地图 JS API | 高德地图API
  15. 电脑硬盘双击打不开,提示格式化怎么办?
  16. 计算机用户域怎么删除,如何删除域内非活动计算机账号?
  17. JavaScript 获取字符串的最后一个字符
  18. 循环语句—for/while/do...while
  19. 二叉树的前序遍历,中序遍历,后序遍历
  20. SUST OJ 1675: Fehead的项目(单调栈)

热门文章

  1. Java+Python+Paddle提取长文本文章中词频,用于Echart词云图数据
  2. 光流法(optical flow)简介
  3. .9.png一些总结
  4. VisualStudio神级插件Resharper技巧基础入门到骨灰玩家使用全教程+Resharper性能优化
  5. unity Scene窗口RectTool失效,MoveTool只能直线移动不能拖动
  6. SpeedTree风力
  7. linux虚拟主机建站程序,bluehost中国Linux虚拟主机建站过程
  8. 分段函数的期望和方差_经典摘录-分段常数概率密度函数的均值和方差
  9. #电商#国内外电商网站
  10. 创建工作空间和功能包