基于偏移量描述的调试函数

2024-06-01 08:29:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解析基于偏移量的ISO-8859-15数据。每行一个条目。没有关于数据和程序在随机行上崩溃的文档,所以我添加了debug函数来查看偏移量是否匹配,并且有额外的描述字段

import os
import sys

import logging

log = logging.getLogger(__name__)

logging.basicConfig(
    stream=sys.stdout,
    level=logging.DEBUG,
)

structure = {
    # Internal
    0: {"descr": "Tietuetunnus", "name": "id", "skip": True},
    5: {"descr": " Ajopäivämäärä", "name": "rundate", "skip": True}, # Date

    # Post code
    13: {"descr": " Postinumero", "name": "postcode", "skip": False},
    18: {"descr": " Postinumeron nimi suomeksi", "name": "fi_postcodename", "skip": False},
    48: {"descr": " Postinumeron nimi ruotsiksi", "name": "se_postcodename", "skip": False},

    # Short name
    78: {"descr": " Postinumeron nimen lyhenne suomeksi", "name": "fi_postcodename_short", "skip": False},
    90: {"descr": " Postinumeron nimen lyhenne ruotsiksi", "name": "se_postcodename_short", "skip": False},

    # Street name
    102: {"descr": "Kadun (paikan) nimi suomeksi", "name": "fi_streetname", "skip": False},
    132: {"descr": "Kadun (paikan) nimi ruotsiksi", "name": "se_streetname", "skip": False},

    # Internal
    162: {"descr": "Tyhjä", "name": "empty1", "skip": True},
    174: {"descr": "Tyhjä", "name": "empty2", "skip": True},

    # Property type
    186: {"descr": "Kiinteistötietojen tyyppi", "name": "propertytype", "skip": False}, # 1 = odd 2 = even

    # Property (large)
    187: {"descr": "Kiinteistönumero 1", "name": "small_propertynumber1", "skip": False},
    192: {"descr": "Kiinteistön jakokirjain 1", "name": "small_property1mark", "skip": False},
    193: {"descr": "Välimerkki", "name": "small_mark", "skip": True}, # Internal
    194: {"descr": "Kiinteistönumero 2", "name": "small_propertynumber2", "skip": False},
    199: {"descr": "Kiinteistön jakokirjain 2", "name": "small_property2mark", "skip": False},

    # Property (small)
    200: {"descr": "Kiinteistönumero 1", "name": "large_propertynumber1", "skip": False},
    205: {"descr": "Kiinteistön jakokirjain 1", "name": "large_property1mark", "skip": False},
    206: {"descr": "Välimerkki", "name": "large_mark", "skip": True}, # Internal
    207: {"descr": "Kiinteistönumero 2", "name": "large_property2mark", "skip": False},
    212: {"descr": "Kiinteistön jakokirjain 2", "name": "large_propertynumber2", "skip": False},

    # Municipality
    213: {"descr": "Kunnan koodi", "name": "municipalitycode", "skip": False},
    216: {"descr": "Kunnan nimi suomeksi", "name": "fi_municipality", "skip": False},
    236: {"descr": "Kunnan nimi ruotsiksi", "name": "se_municipality", "skip": False},
}

def add_debug_offsets(line, offsets, marker="^", descrfield="descr"):
    o = ""
    o += line + os.linesep

    markerline = list(" " * len(line))

    offset_list = []

    for i in map(int, offsets.keys()):
        offset_list.append(i)
        markerline[i] = marker

    o += "".join(markerline) + os.linesep
    offset_list = list(reversed(sorted(offset_list)))

    for offset in offset_list:
        for i in range(offset):
            if i in offset_list:
                o += "|"
            else:
                o += " "
        o += "-- " + offsets[offset][descrfield] + os.linesep

    return o

示例数据:

KATUN2017072204600MÄNTSÄLÄ                      MÄNTSÄLÄ                                              Venlanpolku                                                                         2    2 -    4a    2 -    4b505Mäntsälä            Mäntsälä

例如,这会生成:

KATUN2017072204600MÄNTSÄLÄ                      MÄNTSÄLÄ                                              Venlanpolku                                                                         2    2 -    4a    2 -    4b505Mäntsälä            Mäntsälä
^    ^       ^    ^                             ^                             ^           ^           ^                             ^                             ^           ^           ^^    ^^^    ^^    ^^^    ^^  ^                   ^
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    ||    |||    ||  |                   -- Kunnan nimi ruotsiksi
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    ||    |||    ||  -- Kunnan nimi suomeksi
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    ||    |||    |-- Kunnan koodi
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    ||    |||    -- Kiinteistön jakokirjain 2
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    ||    ||-- Kiinteistönumero 2
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    ||    |-- Välimerkki
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    ||    -- Kiinteistön jakokirjain 1
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    |-- Kiinteistönumero 1
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |||    -- Kiinteistön jakokirjain 2
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    ||-- Kiinteistönumero 2
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    |-- Välimerkki
|    |       |    |                             |                             |           |           |                             |                             |           |           ||    -- Kiinteistön jakokirjain 1
|    |       |    |                             |                             |           |           |                             |                             |           |           |-- Kiinteistönumero 1
|    |       |    |                             |                             |           |           |                             |                             |           |           -- Kiinteistötietojen tyyppi
|    |       |    |                             |                             |           |           |                             |                             |           -- Tyhjä
|    |       |    |                             |                             |           |           |                             |                             -- Tyhjä
|    |       |    |                             |                             |           |           |                             -- Kadun (paikan) nimi ruotsiksi
|    |       |    |                             |                             |           |           -- Kadun (paikan) nimi suomeksi
|    |       |    |                             |                             |           --  Postinumeron nimen lyhenne ruotsiksi
|    |       |    |                             |                             --  Postinumeron nimen lyhenne suomeksi
|    |       |    |                             --  Postinumeron nimi ruotsiksi
|    |       |    --  Postinumeron nimi suomeksi
|    |       --  Postinumero
|    --  Ajopäivämäärä
-- Tietuetunnus

我正在尽可能缩短线条,因为结构可以有更多的字段

像这样:

KATUN2017072204600MÄNTSÄLÄ                      MÄNTSÄLÄ                                              Venlanpolku                                                                         2    2 -    4a    2 -    4b505Mäntsälä            Mäntsälä
^    ^       ^    ^                             ^                             ^           ^           ^                             ^                             ^           ^           ^^    ^^^    ^^    ^^^    ^^  ^                   ^
|    |       |    |                             |                             |           |           |                             |                             -- Tyhjä    -- Tyhjä    ||    |||    ||    |||    ||  |                   -- Kunnan nimi ruotsiksi
|    |       |    |                             |                             |           |           |                             -- Kadun (paikan) nimi ruotsiksi                      ||    |||    ||    |||    ||  -- Kunnan nimi suomeksi
|    |       |    |                             |                             |           |           -- Kadun (paikan) nimi suomeksi                                                     ||    |||    ||    |||    |-- Kunnan koodi
|    |       |    |                             |                             |           --  Postinumeron nimen lyhenne ruotsiksi                                                        ||    |||    ||    |||    -- Kiinteistön jakokirjain 2
|    |       |    |                             |                             --  Postinumeron nimen lyhenne suomeksi                                                                     ||    |||    ||    ||-- Kiinteistönumero 2
|    |       |    |                             --  Postinumeron nimi ruotsiksi                                                                                                           ||    |||    ||    |-- Välimerkki
|    |       |    --  Postinumeron nimi suomeksi                                                                                                                                          ||    |||    ||    -- Kiinteistön jakokirjain 1
|    |       --  Postinumero                                                                                                                                                              ||    |||    |-- Kiinteistönumero 1
|    --  Ajopäivämäärä                                                                                                                                                                    ||    |||    -- Kiinteistön jakokirjain 2
-- Tietuetunnus                                                                                                                                                                           ||    ||-- Kiinteistönumero 2
                                                                                                                                                                                          ||    |-- Välimerkki
                                                                                                                                                                                          ||    -- Kiinteistön jakokirjain 1
                                                                                                                                                                                          |-- Kiinteistönumero 1
                                                                                                                                                                                          -- Kiinteistötietojen tyyppi

这样我去掉了多余的行,而且可读性更好。如何做到这一点

我猜你必须一直试着去第一行,并试图符合描述,如果它不适合去一行低,直到描述适合


Tags: namefalsetruelistoffsetdescrnimiskip