Как разобрать файл, который выглядит как JSON, но который не - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь проанализировать файл (filename.in c) в python, который выглядит следующим образом:

a: 2: {
    s: 3: "somestuff";
    a: 14: {
        i: 601600;
        a: 6: {
            i: 559;
            a: 4: {
                s: 5: "label";
                s: 3: "somelabel";
                s: 2: "id";
                s: 3: "559";
                s: 10: "timestart";
                s: 16: "01 01 1970 00:00";
                s: 8: "timestop";
                s: 16: "24 01 2020 20:55";
            }
            i: 18158;
            a: 4: {
                s: 5: "label";
                s: 12: "someotherlabel";
                s: 2: "id";
                s: 5: "18158";
                s: 10: "timestart";
                s: 16: "01 01 1970 00:00";
                s: 8: "timestop";
                s: 16: "25 01 2020 18:55";
            }
            i: 10402;
            a: 4: {
                s: 5: "label";
                s: 3: "newlabel";
                s: 2: "id";
                s: 5: "10402";
                s: 10: "timestart";
                s: 16: "01 01 1970 00:00";
                s: 8: "timestop";
                s: 16: "26 01 2020 06:55";
            }

и так далее ... Я пытался использовать:

import json

with open('filename.inc') as json_file:
    data = json.load(json_file)

но получил: ValueError: Нет JSON объект может быть декодирован

Я попытался удалить первое двоеточие, добавить кавычки, заменить точку с запятой на кому:

"a2": {
    "s3": "somestuff",
    "a14": {
        "i": 601600,
        "a6": {
            "i": 559,
            "a4": {
                "s5": "label",
                "s3": "somelabel",
                "s2": "id",
                "s3": "559",
                "s10": "timestart",
                "s16": "01 01 1970 00:00",
                "s8": "timestop",
                "s16": "24 01 2020 20:55",
            }
            "i": 18158,
            "a4": {
                "s5": "label",
                "s12": "someotherlabel",
                "s2": "id",
                "s5": "18158",
                "s10": "timestart",
                "s16": "01 01 1970 00:00",
                "s8": "timestop",
                "s16": "25 01 2020 18:55",
            }
            "i": 10402,
            "a4": {
                "s5": "label",
                "s3": "newlabel",
                "s2": "id",
                "s5": "10402",
                "s10": "timestart",
                "s16": "01 01 1970 00:00",
                "s8": "timestop",
                "s16": "26 01 2020 06:55",
            }

но это дает мне несколько ключей с одним и тем же идентификатором ... Мысль о том, чтобы превратить это в html файл с тегами, для анализа с beautifulsoup, но он кажется слишком сложным для такого файла. Буду признателен за любую подсказку, заранее спасибо.

1 Ответ

0 голосов
/ 28 января 2020

Я проверил, пробелы причиняют боль как родному PHP serialize, так и Python phpserialize. Выполненная вами «дезинфекция» в любом случае превращает ее в недопустимый дамп (например, s: 3: "somestuff" недопустим, кодирует 3-символьную строку «somestuff», где «somestuff» явно не имеет длину 3 символа), поэтому мне придется создать мой собственный пример:

source = """
a: 2: {
    i: 0;
    s: 3: "foo";
    i: 1;
    s: 4: "quux";
};
"""

import re
import phpserialize     # requires: pip install phpserialize

cleanup_re = re.compile('(".*?")|\s+')
clean_source = cleanup_re.sub(lambda m: m.group(0) if m.group(1) else "", source)
data = phpserialize.loads(bytes(clean_source, 'utf8'))

Это будет работать только в том случае, если в строках нет двойных кавычек; Я не могу придумать способ сделать это без написания правильного парсера.

...