文件——以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
发起讨论 查看所有版本


暂无话题~