Форум сайта python.su
Всем привет!
Изучаю python первый день.
Написал скрипт для парсинга текстового файла.
Формат текстового файла в двух словах - файл содержит:
1) названия полей ( одно слово, оканчивается на “:” )
2) строки с данными, относящиеся к расположенным выше полям
( дробное число + строка )
3) ненужный мусор: пустые строки + поля, которые в данный момент не используются.
Пример текстового файла:
ip_s: 0.1 1.1.1.1 0.5 1.2.3.4 ip_s_mask: trash1: 0.1 1.1.1.1 ip_d: ip_d_mask: 1.0 255.255.255.255
#!/usr/bin/python2.7 import re types = [ 'ip_s', 'ip_d' ]; filename = "fields.conf" def read_iter( f ): while True: line = f.readline( ) if not line: break line = line.strip( ).rstrip( ':' ) if( not line ): continue yield line f_iter = read_iter( open( filename ) ) one_word_re = re.compile( '^[0-9a-z_]+$' ) cdf = dict( ) try: line = f_iter.next( ) while not line in types: line = f_iter.next( ) cdf_key = line cdf[ cdf_key ] = [] while True: line = f_iter.next( ) while not one_word_re.search( line ): cdf[ cdf_key ].append( line ) line = f_iter.next( ) if( line.replace( '_mask', '' ) in types ): cdf_key = line else: cdf_key = 'trash' cdf[ cdf_key ] = [] except StopIteration: pass del cdf[ 'trash' ] print( cdf )
Отредактировано Des333 (Апрель 2, 2013 01:34:05)
Офлайн
Это конечно не идеал, но кода гораздо меньше :)
def parse(fname, fields): result = {} field = None with open(fname, "rt", encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue if line.endswith(":"): field = line[:-1] if line[:-1] in fields else None if field: result[field] = [] elif field: number, text = line.split(None, 1) result[field].append((float(number), text)) return result if "__main__" == __name__: print(parse("fields.conf", ("ip_s", "ip_d")))
Офлайн
Спасибо большое!
Что-то я прочитал главу про итераторы и они мне весь мозг заполонили
Офлайн