Найти - Пользователи
Полная версия: Парсинг файла. Как сделать красивее?
Начало » Python для новичков » Парсинг файла. Как сделать красивее?
1
Des333
Всем привет!
Изучаю 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 ) 
 


Прошу знающих людей подсказать способы ( а я уверен, что они есть ) сделать код более красивым.

Заранее спасибо!

pyuser
Это конечно не идеал, но кода гораздо меньше :)
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")))
Des333
Спасибо большое!
Что-то я прочитал главу про итераторы и они мне весь мозг заполонили
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB