Python 序列化数据为JSON或CSV

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写入器使用的字典。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程