Как читать / понимать строку сериализованных данных PHP в Python - PullRequest
7 голосов
/ 23 марта 2011

У устаревшей базы данных, к которой я обращаюсь через Django, есть столбец таблицы, в котором хранятся сериализованные данные в следующем формате:

a:5:{i:1;s:4:"1869";i:2;s:4:"1859";i:3;s:4:"1715";i:4;s:1:"0";i:5;s:1:"0";}

Можно ли как-нибудь использовать python / python-library, чтобы изменить егов список или любой другой дружественный тип данных Python для дальнейшей обработки отдельных значений?

Примечание. Эти значения были записаны в базу данных через PHP.

Ответы [ 2 ]

13 голосов
/ 23 марта 2011

phpserialize

порт функций serialize и unserialize из php в python. Этот модуль реализует интерфейс сериализации Python (например: предоставляет dumps , load и аналогичные функции) ...

0 голосов
/ 02 июля 2015

Вот очень грубая и неполная реализация:

def p(f, d):  # parse until
    data = []
    b = f.read(1)
    while b and b != d:
        data.append(b)
        b = f.read(1)
    return b''.join(data)


def parse(f):
    if not hasattr(f, 'read'):
        import io
        try:
            f = io.BytesIO(f)
        except TypeError:
            f = io.BytesIO(f.encode('utf-8'))
    typ = f.read(2)
    if typ == b'i:':
        return int(p(f, b';'))
    if typ == b'd:':
        return float(p(f, b';'))
    if typ == b's:':
        return f.read(int(p(f, b':')) + 3)[1:-2].decode('utf-8')
    if typ == b'a:':
        l = int(p(f, b':'))
        f.read(1)  # {
        items = [(parse(f), parse(f)) for i in range(l)]
        f.read(1)  # }
        return dict(items)
    assert False, typ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...