文件——以JSON格式存储Python对象

未匹配的标注

前一节的 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']

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~