9/27/2011

Способы сериализации в Python: XML & JSON

Сериализация представляет собой процесс сохранения состояния объекта в долговременный вид, такой как файл или база данных, либо приведение к виду, пригодному для передачи между машинами.

Мой код на Python позволяет сохранять объекты, как раз в такой "долговременный вид". В качестве примера взята структура каталогов и файлов в ОС Windows, преобразование её в структуру словарь и дальнейшее сохранение данного объекта в XML и JSON.
Ниже привожу код программы:

Code Save To XML & JSON
import os
from xml.dom.minidom import Document
import json
from xml.etree.ElementTree import tostring

folder = "D:\\Films\\Matrix_Trilogy\\"

nodeDefinitor = "nd"

fileDefinitor = "file"
folderDefinitor = "folder"


def subDict(d, xmlNode, doc):
    for name in d:
        newNode = doc.createElement(nodeDefinitor)
        newNodeText = doc.createTextNode(name)
        if d[name] == None:
            newNode.setAttribute(fileDefinitor, name)
        else:
            newNode.setAttribute(folderDefinitor, name)
        #newNode.appendChild(newNodeText)
        xmlNode.appendChild(newNode)
        if (d[name] != {} and d[name] != None):
            subDict(d[name], newNode, doc)
            
def saveDictionaryToXML(dic):
    doc = Document()
    root = doc.createElement(nodeDefinitor)
    root.setAttribute(folderDefinitor, folder)
    #rootText = doc.createTextNode(folder)
    #root.appendChild(rootText)
    doc.appendChild(root)
    
    subDict(dic, root, doc)
    
    f = open('C:\\test.xml', 'w')
    f.write(doc.toxml())
    f.close()
    
def parse(dir):
    tree = {}
    for i in os.listdir(dir):
        a = os.path.join(dir, i)
        if os.path.isdir(a):
            tree[i] = parse(a)
        else:
            tree[i] = None
    return tree

d = parse(folder)
print d

def saveDicionaryToJson(d):
    stream = json.dumps(d)
    f = open('C:\\test.json', 'w')
    f.write(stream)
    f.close()
    return stream

saveDictionaryToXML(d)

saveDicionaryToJson(d)

Указанная директория была "D:\Films\Matrix_Trylogy" и ниже показан результат работы данного кода: XML-файл и JSON-файл.
XML-файл:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<nd folder="D:\Films\Matrix_Trilogy\">
<nd folder="Matrix_Revolutions">
<nd folder="VIDEO_TS">
<nd file="VTS_02_0.BUP"/>
<nd file="VTS_01_1.VOB"/>
<nd file="VTS_01_3.VOB"/>
<nd file="VTS_01_5.VOB"/>
<nd file="VTS_01_0.IFO"/>
<nd file="VTS_01_0.VOB"/>
<nd file="VTS_01_2.VOB"/>
<nd file="VIDEO_TS.BUP"/>
<nd file="VTS_02_1.VOB"/>
<nd file="VTS_02_0.IFO"/>
<nd file="VTS_01_0.BUP"/>
<nd file="VIDEO_TS.IFO"/>
<nd file="VTS_01_4.VOB"/>
<nd file="VIDEO_TS.VOB"/>
</nd>
</nd>
<nd folder="Matrix">
<nd folder="VIDEO_TS">
<nd file="VTS_02_0.BUP"/>
<nd file="VTS_01_1.VOB"/>
<nd file="VTS_01_3.VOB"/>
<nd file="VTS_01_5.VOB"/>
<nd file="VTS_01_0.IFO"/>
<nd file="VTS_01_0.VOB"/>
<nd file="VTS_01_2.VOB"/>
<nd file="VIDEO_TS.BUP"/>
<nd file="VTS_02_1.VOB"/>
<nd file="VTS_02_0.IFO"/>
<nd file="VTS_01_0.BUP"/>
<nd file="VIDEO_TS.IFO"/>
<nd file="VTS_01_4.VOB"/>
<nd file="VIDEO_TS.VOB"/>
</nd>
</nd>
<nd folder="Matrix_Reloaded">
<nd folder="VIDEO_TS">
<nd file="VTS_02_0.BUP"/>
<nd file="VTS_01_1.VOB"/>
<nd file="VTS_01_3.VOB"/>
<nd file="VTS_01_5.VOB"/>
<nd file="VTS_01_0.IFO"/>
<nd file="VTS_01_0.VOB"/>
<nd file="VTS_01_2.VOB"/>
<nd file="VIDEO_TS.BUP"/>
<nd file="VTS_02_1.VOB"/>
<nd file="VTS_02_0.IFO"/>
<nd file="VTS_01_0.BUP"/>
<nd file="VIDEO_TS.IFO"/>
<nd file="VTS_01_4.VOB"/>
<nd file="VIDEO_TS.VOB"/>
</nd>
</nd>
</nd>
JSON-файл:
{"Matrix_Revolutions": {"VIDEO_TS": {"VTS_02_0.BUP": null, "VTS_01_1.VOB": null, "VTS_01_3.VOB": null, "VTS_01_5.VOB": null, "VTS_01_0.IFO": null, "VTS_01_0.VOB": null, "VTS_01_2.VOB": null, "VIDEO_TS.BUP": null, "VTS_02_1.VOB": null, "VTS_02_0.IFO": null, "VTS_01_0.BUP": null, "VIDEO_TS.IFO": null, "VTS_01_4.VOB": null, "VIDEO_TS.VOB": null}}, "Matrix": {"VIDEO_TS": {"VTS_02_0.BUP": null, "VTS_01_1.VOB": null, "VTS_01_3.VOB": null, "VTS_01_5.VOB": null, "VTS_01_0.IFO": null, "VTS_01_0.VOB": null, "VTS_01_2.VOB": null, "VIDEO_TS.BUP": null, "VTS_02_1.VOB": null, "VTS_02_0.IFO": null, "VTS_01_0.BUP": null, "VIDEO_TS.IFO": null, "VTS_01_4.VOB": null, "VIDEO_TS.VOB": null}}, "Matrix_Reloaded": {"VIDEO_TS": {"VTS_02_0.BUP": null, "VTS_01_1.VOB": null, "VTS_01_3.VOB": null, "VTS_01_5.VOB": null, "VTS_01_0.IFO": null, "VTS_01_0.VOB": null, "VTS_01_2.VOB": null, "VIDEO_TS.BUP": null, "VTS_02_1.VOB": null, "VTS_02_0.IFO": null, "VTS_01_0.BUP": null, "VIDEO_TS.IFO": null, "VTS_01_4.VOB": null, "VIDEO_TS.VOB": null}}}
Спасибо за внимание!

2 комментария:

  1. Было бы прикольно древовидно отформатировать JSON.

    Кроме того, тут нет упоминания, чем тебя не устраивает pickle и marshal сериализация. Я так понимаю, речь идет о человекочитаемости и интероперабельности с другими языками?

    ОтветитьУдалить
  2. И что, кстати, на счет десериализации? будет ли твой JSON код автоматически понят как дикшинари?

    ОтветитьУдалить