2013-05-26 2 views
0

Какие методы/модули вы использовали бы для разбора определенных секций строк. Указанные строки типа:Разделительные строки строк

field 1: dog  field 2: first  comment: outstanding 
field 1: cat  field 2:    comment: some comment about the cat 

Название полей всегда заканчивается двоеточием, значения полей могут быть пустыми, и поля разделены только пробелами. Я просто хочу получить доступ к значениям полей. Я знаю, как это сделать с использованием регулярного выражения, но я уверен, что с Python есть более элегантные способы сделать это.

+0

Разделяется ли эта закладка? – jamylak

+0

@jamylak нет, просто пробелы. –

+0

выглядит как regex, может быть, путь сюда, как вы знаете, когда есть другое поле? Есть ли в нем больше одного места, чтобы указать это? – jamylak

ответ

2

Это выглядит как фиксированный формат ширины для меня.

Если да, то вы можете сделать это:

data={} 
ss=((0,19),(20,41),(42,80)) 
with open('/tmp/p.txt','r') as f: 
    for n,line in enumerate(f): 
     fields={} 
     for i,j in ss: 
      field=line[i:j] 
      t=field.split(':') 
      fields[t[0].strip()]=t[1].strip() 
     data[n]=fields  

print data 

Печать:

{0: {'comment': 'outstanding', 'field 2': 'first', 'field 1': 'dog'}, 1: {'comment': 'some comment about the cat', 'field 2': '', 'field 1': 'cat'}} 

Если вы хотите получить список:

data=[] 
ss=((0,19),(20,41),(42,80)) 
with open('/tmp/p.txt','r') as f: 
    for n,line in enumerate(f): 
     fields={} 
     for i,j in ss: 
      field=line[i:j] 
      t=field.split(':') 
      fields[t[0].strip()]=t[1].strip() 
     data.append(fields) 

В любом случае, вы можете получить доступ к:

>>> data[0]['comment'] 
'outstanding'     
+0

Я думаю, что «список» был бы более уместным, потому что использование '0',' 1' в качестве ключей ничего не улучшает. Доступ к элементу по индексу также является операцией «O (1)» в списках, и они также поддерживают порядок. –

+0

Легкое изменение, если это важно. Я не думаю, что это главный вопрос в этом вопросе. – dawg

0

Что-то вроде этого:

>>> with open("abc") as f: 
    lis = [] 
    for line in f: 
     lis.append(dict(map(str.strip, x.split(":")) for x in line.split(" "*8))) 
...   
>>> lis 
[{'comment': 'outstanding', 'field 2': 'first', 'field 1': 'dog'}, 
{'comment': 'some comment about the cat', 'field 2': '', 'field 1': 'cat'} 
] 

>>> lis[0]['comment'] #access 'comment' field on line 1 
'outstanding' 
>>> lis[1]['field 2'] # access 'field 2' on line 2 
'' 
0

Другой вариант заключается в использовании csv модуль.

Предполагая, что есть вкладка разделитель между полями:

import StringIO 
import csv 

input_data = StringIO.StringIO("""field 1: dog field 2: first comment: outstanding 
field 1: cat field 2: comment: some comment about the cat""") 

data = [] 
for row in csv.reader(input_data, delimiter="\t"): 
    line = {} 
    for item in row: 
     value = item.split(":") 
     line[value[0]] = value[1].strip() 

    data.append(line) 

print data 

печатает

[{'comment': 'outstanding', 'field 2': 'first', 'field 1': 'dog'}, {'comment': 'some comment about the cat', 'field 2': '', 'field 1': 'cat'}] 
Смежные вопросы