Python 序列化数据为JSON或CSV格式,JSON序列化器和CSV序列化器很相似,因为它们都依赖Python库来进行序列化。这些库本质上都是命令式的,因此函数体由严格的语句序列组成。
JSON序列化器如下所示:
import json
@to_bytes
def serialize_json(series: str, data: List[Pair]) -> str:
"""
>>> data = [Pair(2,3), Pair(5,7)]
>>> serialize_json( "test", data )
b'[{"x": 2, "y": 3}, {"x": 5, "y": 7} ]'
"""
obj = [dict(x=r.x, y=r.y) for r in data]
text = json.dumps(obj, sort_keys=True)
return text
这样就创建了一个字典列表的结构,并使用json.dumps()
函数创建了字符串表示形式。JSON模块要求具体化的list
对象,因此不能提供惰性生成器函数。尽管参数值sort_keys=True
有助于单元测试,但它不是应用程序所必需的,而且会引入一些开销。
CSV序列化器如下所示:
import csv
import io
@to_bytes
def serialize_csv(series: str, data: List[Pair]) -> str:
"""
>>> data = [Pair(2,3), Pair(5,7)]
>>> serialize_csv("test", data)
b'x,y\\r\\n2,3\\r\\n5,7\\r\\n'
"""
buffer = io.StringIO()
wtr = csv.DictWriter(buffer, Pair._fields)
wtr.writeheader()
wtr.writerows(r._asdict() for r in data)
return buffer.getvalue()
CSV模块的读取器和写入器混合了命令式元素和函数式元素。我们必须创建写入器,并按照严格的顺序正确创建表头。上面使用了Pair
命名元组的_fields
属性来为写入器确定列标题。
写入器的writerows()
方法可以接收一个惰性生成器函数。本例中使用了每个Pair
对象的_asdict()
方法来返回一个适合CSV写入器使用的字典。