Сначала мы игнорируем концепцию группировки по блокам и пытаемся получить каждую правильную строку в виде словаря.Мы будем хранить это в переменной s
.
filename = 'data.txt'
s = [ { x.split(':')[0] : x.split(':')[1].strip() } for x in open(filename).read().split('\n') if ':' in x ]
. Это даст следующий вывод:
[{'inetnum': '193.194.64.0 - 193.194.95.255'}, {'netname': 'DZ-ARN-970407'}, {'descr': 'PROVIDER'}, {'descr': 'Algerian Academic Research Network'}, {'country': 'DZ'}, {'org': 'ORG-AARN1-AFRINIC'}, {'admin-c': 'EG71'}, {'tech-c': 'EG71'}, {'status': 'ALLOCATED PA'}, {'remarks': 'data has been transferred from RIPE Whois Database 20050221'}, {'notify': '***@arn.dz'}, {'notify': '***@arn.dz'}, {'mnt-by': 'AFRINIC-HM-MNT'}, {'mnt-lower': 'AS16214-MNT'}, {'changed': '***@ripe.net 19970407'}, {'changed': '***@ripe.net 19981020'}, {'changed': '***@ripe.net 19990104'}, {'changed': '***@ripe.net 20000309'}, {'changed': '***@ripe.net 20000428'}, {'changed': '***@ripe.net 20020313'}, {'changed': '***@afrinic.net 20050205'}, {'changed': '***@afrinic.net 20121211'}, {'changed': '***@afrinic.net 20180212'}, {'changed': '***@afrinic.net 20180228'}, {'source': 'AFRINIC'}, {'inetnum': '193.95.0.0 - 193.95.127.255'}, ... ]
Теперь мы выясним, где находятся разделители (то есть строкибез ":") размещаются.Мы будем хранить это в переменной t
.
t = ''.join([ "1" if ':' in x else "0" for x in open(filename).read().split('\n')]).strip("0")
. Это даст строку, где «1» обозначает нормальную строку, а «0» обозначает разделитель.
'111111111111111111111111101111111111111111111111111111111011111111111111111111111101111111111111111111110111111111111111111111011111111111111111111111'
Затем мы добавляем разделители «0» в наш список словарей в соответствии с шаблоном, хранящимся в t
.Мы назовем это w
.
w = [ s.pop(0) if int(x) else "0" for x in t ]
Теперь у нас есть что-то вроде этого:
[ ... {'changed': '***@afrinic.net 20170214'}, {'source': 'AFRINIC'}, '0', {'inetnum': '194.204.192.0 - 194.204.255.255'}, {'netname': 'ONPT'}, {'descr': 'Office National des Postes et Telecommunications'}, {'descr': 'aka Maroc Telecom'}, {'country': 'MA'}, ... ]
Итак, мы можем найти индексы для строк «0» и использовать их дляразделить этот список на список списков.Мы также будем использовать фильтр для удаления разделителя «0» из результата.
indices = [ i for (i,x) in enumerate(w) if x == '0' ]
right = indices + [len(w)]
left = [0] + indices
result = [ list(filter(lambda x: x != "0", w[start:end])) for (start,end) in zip(left,right)]
Итак, теперь result
имеет желаемый результат, как мы видим, запустив import pprint; pprint.PrettyPrinter().pprint(result)
:
[[{'inetnum': '193.194.64.0 - 193.194.95.255'},
{'netname': 'DZ-ARN-970407'},
{'descr': 'PROVIDER'},
{'descr': 'Algerian Academic Research Network'},
{'country': 'DZ'},
{'org': 'ORG-AARN1-AFRINIC'},
{'admin-c': 'EG71'},
{'tech-c': 'EG71'},
{'status': 'ALLOCATED PA'},
{'remarks': 'data has been transferred from RIPE Whois Database 20050221'},
{'notify': '***@arn.dz'},
{'notify': '***@arn.dz'},
{'mnt-by': 'AFRINIC-HM-MNT'},
{'mnt-lower': 'AS16214-MNT'},
{'changed': '***@ripe.net 19970407'},
{'changed': '***@ripe.net 19981020'},
{'changed': '***@ripe.net 19990104'},
{'changed': '***@ripe.net 20000309'},
{'changed': '***@ripe.net 20000428'},
{'changed': '***@ripe.net 20020313'},
{'changed': '***@afrinic.net 20050205'},
{'changed': '***@afrinic.net 20121211'},
{'changed': '***@afrinic.net 20180212'},
{'changed': '***@afrinic.net 20180228'},
{'source': 'AFRINIC'}],
[{'inetnum': '193.95.0.0 - 193.95.127.255'},
{'netname': 'TN-ATI-20010402'},
{'descr': 'Agence Tunisienne Internet - ATI'},
{'descr': 'Provider Local Registry'},
{'country': 'TN'},
{'org': 'ORG-ATIA2-AFRINIC'},
{'admin-c': 'JF13-AFRINIC'},
{'tech-c': 'TG12-AFRINIC'},
{'status': 'ALLOCATED PA'},
{'remarks': 'Previously allocated to eu.eunet'},
{'remarks': 'data has been transferred from RIPE Whois Database 20050221'},
{'notify': '***@ati.tn'},
{'notify': '***@ati.tn'},
{'notify': '***@ati.tn'},
{'notify': '***@ati.tn'},
{'mnt-by': 'AFRINIC-HM-MNT'},
{'mnt-lower': 'ATI-MNT'},
{'mnt-domains': 'ATI-MNT'},
{'changed': '***@EU.net 19960208'},
{'changed': '***@ripe.net 19960513'},
{'changed': '***@EU.net 19990201'},
{'changed': '***@ripe.net 19990202'},
{'changed': '***@EU.net 19990204'},
{'changed': '***@ripe.net 20000420'},
{'changed': '***@ripe.net 20040226'},
{'changed': '***@afrinic.net 20050205'},
{'changed': '***@ripe.net 20050218'},
{'changed': '***@afrinic.net 20130611'},
{'changed': '***@afrinic.net 20161208'},
{'changed': '***@afrinic.net 20170214'},
{'source': 'AFRINIC'}],
[{'inetnum': '194.204.192.0 - 194.204.255.255'},
{'netname': 'ONPT'},
{'descr': 'Office National des Postes et Telecommunications'},
{'descr': 'aka Maroc Telecom'},
{'country': 'MA'},
{'admin-c': 'SM13-AFRINIC'},
{'tech-c': 'SM13-AFRINIC'},
{'org': 'ORG-ONdP1-AFRINIC'},
{'status': 'ALLOCATED PA'},
{'mnt-by': 'AFRINIC-HM-MNT'},
{'mnt-lower': 'ONPT-MNT'},
{'notify': '***@iam.net.ma'},
{'notify': '***@menara.ma'},
{'changed': '***@ripe.net 19960111'},
{'changed': '***@ripe.net 19980203'},
{'changed': '***@ripe.net 19990422'},
{'changed': '***@ripe.net 20030106'},
{'changed': '***@afrinic.net 20050205'},
{'changed': '***@afrinic.net 20060828'},
{'changed': '***@afrinic.net 20100118'},
{'changed': '***@afrinic.net 20100208'},
{'changed': '***@afrinic.net 20100609'},
{'changed': '***@afrinic.net 20110602'},
{'source': 'AFRINIC'}],
[{'inetnum': '194.79.96.0 - 194.79.127.255'},
{'netname': 'EG-IE-951129'},
{'descr': 'Internet Egypt Co.'},
{'country': 'EG'},
{'org': 'ORG-NO1-AFRINIC'},
{'admin-c': 'MM2370-AFRINIC'},
{'admin-c': 'IAM13-AFRINIC'},
{'tech-c': 'MM2370-AFRINIC'},
{'tech-c': 'IAM13-AFRINIC'},
{'status': 'ALLOCATED PA'},
{'notify': '***@etisalat.com'},
{'mnt-by': 'AFRINIC-HM-MNT'},
{'mnt-lower': 'AS5536-MNT'},
{'changed': '***@ripe.net 19951129'},
{'changed': '***@ripe.net 19980916'},
{'changed': '***@ripe.net 20020215'},
{'changed': '***@ripe.net 20020220'},
{'changed': '***@afrinic.net 20050205'},
{'changed': '***@afrinic.net 20111021'},
{'changed': '***@afrinic.net 20180215'},
{'source': 'AFRINIC'}],
[{'inetnum': '195.202.64.0 - 195.202.95.255'},
{'netname': 'MTN-Business'},
{'descr': 'MTN Business'},
{'country': 'KE'},
{'admin-c': 'NA34-AFRINIC'},
{'tech-c': 'NA34-AFRINIC'},
{'org': 'ORG-NOIS1-AFRINIC'},
{'status': 'ALLOCATED PA'},
{'mnt-by': 'AFRINIC-HM-MNT'},
{'mnt-lower': 'AS9129-MNT'},
{'remarks': 'data has been transferred from RIPE Whois Database 20050221'},
{'notify': '***@mtnbusiness.co.ke'},
{'notify': '***@mtnbusiness.co.ke'},
{'changed': '***@ripe.net 19970228'},
{'changed': '***@ripe.net 20020312'},
{'changed': '***@ripe.net 20020315'},
{'changed': '***@afrinic.net 20050205'},
{'changed': '***@afrinic.net 20120731'},
{'changed': '***@afrinic.net 20120801'},
{'changed': '***@afrinic.net 20140801'},
{'source': 'AFRINIC'}],
[{'inetnum': '195.24.192.0 - 195.24.223.255'},
{'netname': 'CM-CAMTEL-970403'},
{'descr': 'Data communication and international'},
{'descr': 'telecommunication of Cameroon'},
{'country': 'CM'},
{'org': 'ORG-IA6-AFRINIC'},
{'admin-c': 'NED2-AFRINIC'},
{'tech-c': 'JN1000-AFRINIC'},
{'tech-c': 'BLV1-AFRINIC'},
{'tech-c': 'TAJJ1-AFRINIC'},
{'status': 'ALLOCATED PA'},
{'notify': '***@camnet.cm'},
{'notify': '***@camnet.cm'},
{'notify': '***@camnet.cm'},
{'notify': '***@yahoo.com'},
{'mnt-by': 'AFRINIC-HM-MNT'},
{'mnt-lower': 'CAMTEL-MNT'},
{'mnt-routes': 'CAMTEL-MNT'},
{'changed': '***@afrinic.net 20060601'},
{'changed': '***@afrinic.net 20060602'},
{'changed': '***@afrinic.net 20121213'},
{'changed': '***@afrinic.net 20140918'},
{'source': 'AFRINIC'}]]
Итак, вот весь код, который мы написали:
filename = 'data.txt'
s = [ { x.split(':')[0] : x.split(':')[1].strip() } \
for x in open(filename).read().split('\n') if ':' in x ]
t = ''.join([ "1" if ':' in x else "0" \
for x in open(filename).read().split('\n')]).strip("0")
w = [ s.pop(0) if int(x) else "0" \
for x in t ]
indices = [ i for (i,x) in enumerate(w) if x == '0' ]
right = indices + [len(w)]
left = [0] + indices
result = [ list(filter(lambda x: x != "0", w[start:end])) \
for (start,end) in zip(left,right)]