正常情况下,我们想访问字典中的某个值,都是通过中括号访问,比如:
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
另外,可以看到默认情况下转换后,字典键值中的空格被转化为了下划线。
下面具体介绍 Box 模块的使用方法。
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。
(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.
(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南
Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:
pip install --upgrade python-box[all]
2.基本使用
我们可以像文章开头那样传入一个字典给 Box,生成一个Box对象;也可以直接使用参数赋值的方式生成一个Box对象:
from box import Box my_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) # Sarge my_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 Box box_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 Box box_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 Box box_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 BoxList my_boxlist = BoxList({'item': x} for x in range(10)) # <BoxList: [<Box: {'item': 0}>, <Box: {'item': 1}>, ... my_boxlist[5].item # 5 print(type(my_boxlist.to_list())) # <class 'list'>
3.导入导出功能
Box对象有一个很方便的功能,就是能够轻松地将Box对象导出为Json/yaml/csv/msgpack文件:
from box import BoxList my_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。
还有更多的特性,大家可以参考 Box 模块官方WIki:
https://github.com/cdgriffith/Box/wiki
我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典