2015-10-05 5 views
1

Привет я пытаюсь создать список параметров из файласоздать список список параметров из файла

Конечный результат должен быть что-то вроде

парам = [[поле], [единицы ], [высота], [сайт]]

проблема в том, что информация разбивается на строки и некоторые из параметров не имеют всю информацию

#info in the file 
[field1] 
unit=m/s 
height=70.4 
site=site1 
[field2] 
height=20.6 
site=site2 
[field3] 
units=m 
... 

так я хотел бы выполнить все поля таким образом, что, если нет информации присваивает 0 или «»

конечный результат в примере

парам = {поле1: «м/с», 70,4, «site1», поле2: '', 20.6, site2, field3: 'm', 0, ''}

Я знаю, как создать словарь из списка списков, но не устанавливать значения по умолчанию ('' для значений строк 0 для числовые) в случае, если некоторые значения отсутствуют

Благодарности

+1

Может быть [** 'ConfigParser' **] (https://docs.python.org/2/library/configparser.html) поможет. –

+0

Значит, у них не все одинаковые числа полей? –

+0

В каждом поле могут быть единицы, высота, место. На самом деле я должен создать словарь с {поле: [единица, высота, сайт]} – gis20

ответ

1

Вы могли группу с помощью defaultdict:

from collections import defaultdict 

with open("test.txt") as f: 
    d = defaultdict(list) 
    for line in map(str.rstrip, f): 
     if line.startswith("["): 
      d["fields"].append(line.strip("[]")) 
     else: 
      k,v = line.split("=") 
      d[k].append(v) 

Input ::

[field1] 
unit=m/s 
height=70.4 
site=site1 
[field2] 
height=20.6 
site=site2 
[field3] 
unit=m 
height=6.0 
site=site3 

Выход:

defaultdict(<type 'list'>, {'fields': ['field1', 'field2', 'field3'], 
'site': ['site1', 'site2', 'site3'], 'unit': ['m/s', 'm'], 
'height': ['70.4', '20.6', '6.0']}) 

Если вы действительно хотите, чтобы сгруппировать по полю, вы можете использовать itertools.groupby группировку по линиям, которые начинаются с [:

from itertools import groupby 

with open("test.txt") as f: 
    grps, d = groupby(map(str.rstrip,f), key=lambda x: x.startswith("[")), {} 
    for k,v in grps: 
     if k: 
      k, v = next(v).strip("[]"), list(next(grps)[1]) 
      d[k] = v 
    print(d) 

Выход:

{'field2': ['height=20.6', 'site=site2'], 
'field3': ['unit=m', 'height=6.0', 'site=site3'], 
'field1': ['unit=m/s', 'height=70.4', 'site=site1']} 

Каждый k представляет собой линию, начиная с [, мы тогда называем рядом с объектом морской окунь, чтобы получить все строки до следующей строки, начиная с [ или EOF:

1

Это будет заполнить недостающую информацию.

f= open('file.txt','r')  
field, units, height, site = [],[],[],[] 
param = [ field, units, height, site] 

lines = f.readlines() 

i=0 
while True: 
    try: 
     line1 = lines[i].rstrip() 
     if line1.startswith('['): 
      field.append(line1.strip('[]')) 
     else: 
      field.append(0) 
      i-= 1 
    except: 
     field.append(0)  

    try: 
     line2 = lines[i+1].rstrip() 
     if line2.startswith('unit') or line2.startswith('units'): 
      units.append(line2.split('=')[-1]) 
     else: 
      units.append('') 
      i-=1 
    except: 
     units.append('') 

    try: 
     line3 = lines[i+2].rstrip() 
     if line3.startswith('height'): 
      height.append(line3.split('=')[-1]) 
     else: 
      height.append(0) 
      i-=1 
    except: 
     height.append(0)  

    try: 
     line4 = lines[i+3].rstrip() 
     if line4.startswith('site'): 
      site.append(line4.split('=')[-1]) 
     else: 
      site.append('')      
    except: 
     site.append('') 
     break 

    i +=4 

Выход:

param: 
[['field1', 'field2', 'field3'], 
['m/s', '', 'm'], 
['70.4', '20.6', 0], 
['site1', 'site2', '']] 
Смежные вопросы