文件——以json格式存储python对象 | 第二部分 类型与操作 —— 第 9 章: 元组,文件和其他 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-大发黄金版app下载

未匹配的标注

前一节的 pickle 模块将几乎任意的python对象转换为专为python开发的专有格式,并在性能上打磨了很多年。json 是一个更新的,新兴的数据交换格式,它既程序语言中立又被许多系统支持。比如,mongodb,将数据存储在json文档数据库中(使用二进制json格式)。

json不支持像pickle那么多python对象类型,但它的可移植性在某些场景下是一个优势,且它表示了另一种序列化特定类别的python对象用来存储和传输的方法。而且,因为json和python字典和列表在语法上如此相近,所以在它与python对象之间的相互转换是很简单的,且被 json 标准库模块自动完成。

比如,带有嵌套结构的python字典非常类似于json数据,虽然python的变量和表达式支持更丰富的结构选项(下面的任何一部分都可以是python代码中的任意表达式):

>>> name = dict(first='bob', last='smith')
>>> rec = dict(name=name, job=['dev', 'mgr'], age=40.5)
>>> rec
{'job': ['dev', 'mgr'], 'name': {'last': 'smith', 'first': 'bob'},
'age': 40.5}

这里显示的最终字典格式是python中的有效字面量,且当按原样打印出时几乎和json看起来一样,但 json 模块让转换变得正式——这里在内存中将python对象与json序列化的字符串表示形式相互转换:

>>> import json
>>> json.dumps(rec)
'{"job": ["dev", "mgr"], "name": {"last": "smith", "first": "bob"},
"age": 40.5}'
>>> s = json.dumps(rec)
>>> s
'{"job": ["dev", "mgr"], "name": {"last": "smith", "first": "bob"},
"age": 40.5}'
>>> o = json.loads(s)
>>> o
{'job': ['dev', 'mgr'], 'name': {'last': 'smith', 'first': 'bob'},
'age': 40.5}
>>> o == rec
true

python对象与文件中的json数据字符串之间的相互转换也是类似地简单。在被存储到文件前,数据只是简单的python对象;当json模块从文件载入json的文本表示时,json模块重新创建了它们:

>>> json.dump(rec, fp=open('testjson.txt', 'w'), indent=4)
>>> print(open('testjson.txt').read())
{
    "job": [
        "dev",
        "mgr"
    ],
    "name": {
        "last": "smith",
        "first": "bob"
    },
    "age": 40.5
}
>>> p = json.load(open('testjson.txt'))
>>> p
{'job': ['dev', 'mgr'], 'name': {'last': 'smith', 'first': 'bob'},
'age': 40.5}

一旦从json文本中转换为对象,就可以在脚本中使用普通的python对象操作来处理数据。要获取关于json相关主题的更多细节,请参见python的库手册并搜索网络。

注意:为了支持从国际化字符集中提取出的文本,json中的字符串都是unicode的,so you’ll see a leading u on strings after translating from json data in python 2.x (but not in 3.x); this is just the syntax of unicode objects in 2.x, as introduced chapter 4 and chapter 7, and
covered in full in chapter 37. 因为unicode文本字符串支持所有常见的字符串操作,当文本处于内存中时这个差异可以忽略;当在文件中来回转换时且通常只对于非acsii文本类型(这里编码开始起作用),这个差异很重要。


注意

在python世界还有对“对象和xml(在第37章使用的文本格式)的相互转换”的支持。请上网查询细节。要了解另一个半相关的处理格式化数据文件的工具,请参见标准库的csv模块。它解析和创建了在文件和字符串中的csv(comma-separated value)数据。它没有直接映射为python对象,但却是另一个常见的数据交换格式:

>>> import csv
>>> rdr = csv.reader(open('csvdata.txt'))
>>> for row in rdr: print(row)
...
['a', 'bbb', 'cc', 'dddd']
['11', '22', '33', '44']

本文章首发在 大发黄金版app下载 网站上。

上一篇 下一篇
讨论数量: 0



暂无话题~
网站地图