Trwałość danych w języku Python - moduł Marshal

Funkcje serializacji obiektów modułu marshal w standardowej bibliotece Pythona są podobne do modułu pikle. Jednak ten moduł nie jest używany do danych ogólnego przeznaczenia. Z drugiej strony jest używany przez sam Python do wewnętrznej serializacji obiektów Pythona do obsługi operacji odczytu / zapisu na skompilowanych wersjach modułów Pythona (pliki .pyc).

Format danych używany przez moduł Marshal nie jest zgodny z wersjami języka Python. Dlatego skompilowany skrypt Pythona (plik .pyc) jednej wersji najprawdopodobniej nie zostanie wykonany na innej.

Podobnie jak moduł pickle, moduł marshal zdefiniował również funkcje load () i dump () do odczytu i zapisu uporządkowanych obiektów z / do pliku.

wysypisko()

Ta funkcja zapisuje w pliku reprezentację bajtową obsługiwanego obiektu Pythona. Sam plik jest plikiem binarnym z uprawnieniami do zapisu

Załaduj()

Ta funkcja odczytuje dane bajtowe z pliku binarnego i konwertuje je na obiekt Pythona.

Poniższy przykład demonstruje użycie funkcji dump () i load () do obsługi obiektów kodu Pythona, które są używane do przechowywania wstępnie skompilowanych modułów Pythona.

Kod używa wbudowanego compile() funkcja, aby zbudować obiekt kodu z ciągu źródłowego, który osadza instrukcje Pythona.

compile(source, file, mode)

Parametr pliku powinien być plikiem, z którego został odczytany kod. Jeśli nie został odczytany z pliku, należy przekazać dowolny ciąg.

Parametr trybu to „exec”, jeśli źródło zawiera sekwencję instrukcji, „eval”, jeśli istnieje pojedyncze wyrażenie, lub „single”, jeśli zawiera pojedynczą instrukcję interaktywną.

Obiekt kodu kompilacji jest następnie przechowywany w pliku .pyc przy użyciu funkcji dump ().

import marshal
script = """
a=10
b=20
print ('addition=',a+b)
"""
code = compile(script, "script", "exec")
f=open("a.pyc","wb")
marshal.dump(code, f)
f.close()

Do deserializacji obiekt z pliku .pyc używa funkcji load (). Ponieważ zwraca obiekt kodu, można go uruchomić za pomocą exec (), innej funkcji wbudowanej.

import marshal
f=open("a.pyc","rb")
data=marshal.load(f)
exec (data)