Форум сайта python.su
0
задача: обработать лог с экспортом в csv
лог выглядит так:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP> inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 nd6 options=201<PERFORMNUD,DAD> gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether f4:0f:24:29:df:4d inet6 fe80::1cb5:1689:1826:cc7b%en0 prefixlen 64 secured scopeid 0x4 inet 10.176.85.19 netmask 0xffffff00 broadcast 10.176.85.255 nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active en1: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500 options=60<TSO4,TSO6> ether 06:00:58:62:a3:00 media: autoselect <full-duplex> status: inactive p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304 ether 06:0f:24:29:df:4d media: autoselect status: inactive
Отредактировано Fixx_Jr (Фев. 3, 2019 21:43:36)
Офлайн
857
Задача поставлена верно. Это важный критерий, потому что бывает неправильная постановка задачи в виде тумана или желе. Бывают ещё пластилиновые задачи - это когда она сейчас одна, через час становится другая вообще, а ещё через час - вообще третья. То есть это всё, что нужно устранять в задаче, прежде чем начинать её решать.
Fixx_JrВообще, такой класс задач гарантированно решается через конечные автоматы. У них там много всяких разновидностей. Так что если не можешь что-то сделать, то надо подтягивать теорию по ДКА (детерминированный конечный автомат). Если изучишь, будешь все такие задачи как орешки щёлкать.
Думаю, что надо разбить на кусочки(абзацы), а из них уже выжимать то, что есть в листы.
Fixx_JrНадо обнаружить максимальные структуры, из которых состоят данные, и сделать код для их разделения. Затем надо одну такую структуру тоже делить и тоже на максимальные структуры, из которых она состоит, получив второй кусок кода. Так ты продолжаешь спускаться с максимального уровня структур до минимального уровня структур, пока не получишь самые простые элементы.
Но не могу сообразить, как эти абзацы достать
Отредактировано py.user.next (Фев. 4, 2019 02:24:19)
Офлайн
4
Fixx_JrЯ бы порезал по “: flags=”, а потом каждый кусок отдельно по “\n”.
Думаю, что надо разбить на кусочки(абзацы), а из них уже выжимать то, что есть в листы.
Офлайн
0
uf4JaiD5
Я бы порезал по “: flags=”, а потом каждый кусок отдельно по “\n”.
Офлайн
типа так
>>> out = [] >>> tmp =[] >>> for i in s.split('\n'): if 'flags=' in i: out.append(tmp) tmp = [] tmp.append(i) else: tmp.append(i) >>> for i in out[1:]: print(i) ['lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384', '\toptions=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>', '\tinet 127.0.0.1 netmask 0xff000000 ', '\tinet6 ::1 prefixlen 128 ', '\tinet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 ', '\tnd6 options=201<PERFORMNUD,DAD>'] ['gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280'] ['en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500', '\tether f4:0f:24:29:df:4d ', '\tinet6 fe80::1cb5:1689:1826:cc7b%en0 prefixlen 64 secured scopeid 0x4 ', '\tinet 10.176.85.19 netmask 0xffffff00 broadcast 10.176.85.255', '\tnd6 options=201<PERFORMNUD,DAD>', '\tmedia: autoselect', '\tstatus: active'] ['en1: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500', '\toptions=60<TSO4,TSO6>', '\tether 06:00:58:62:a3:00 ', '\tmedia: autoselect <full-duplex>', '\tstatus: inactive'] >>>
Офлайн
блин, очепятался
после цикла надо еще раз
if tmp: out.append(tmp)
Отредактировано vic57 (Фев. 4, 2019 23:38:57)
Офлайн
0
vic57это чтобы последний абзац добавить?
блин, очепятался
после цикла надо еще раз
Офлайн
Fixx_Jrну да,
это чтобы последний абзац добавить?
out = [] tmp = [] for i in s.split('\n'): i = i.strip() if 'flags=' in i and tmp: out.append(tmp) tmp = [] tmp.append(i) if tmp: out.append(tmp) d = {} for i in out: l = i[0].split(':') k = l[0].strip() i[0] = l[1].strip() d[k] = i import json print(json.dumps(d,indent=4))
{ "lo0": [ "flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384", "options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>", "inet 127.0.0.1 netmask 0xff000000", "inet6 ::1 prefixlen 128", "inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1", "nd6 options=201<PERFORMNUD,DAD>" ], "gif0": [ "flags=8010<POINTOPOINT,MULTICAST> mtu 1280" ], "en0": [ "flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500", "ether f4:0f:24:29:df:4d", "inet6 fe80::1cb5:1689:1826:cc7b%en0 prefixlen 64 secured scopeid 0x4", "inet 10.176.85.19 netmask 0xffffff00 broadcast 10.176.85.255", "nd6 options=201<PERFORMNUD,DAD>", "media: autoselect", "status: active" ], "en1": [ "flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500", "options=60<TSO4,TSO6>", "ether 06:00:58:62:a3:00", "media: autoselect <full-duplex>", "status: inactive" ], "p2p0": [ "flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304", "ether 06:0f:24:29:df:4d", "media: autoselect", "status: inactive" ] }
Офлайн