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 

필드 이름은 항상 콜론으로 끝나며 필드 값은 공백 일 수 있으며 필드는 공백으로 만 구분됩니다. 필드 값에 액세스하고 싶습니다. 정규 표현식을 사용하여이 작업을 수행하는 방법을 알고 있지만 파이썬으로이 작업을 수행하는보다 세련된 방법이 있다고 확신합니다. 이 같은

+0

이 탭은 구분됩니까? – jamylak

+0

@jamylak 아니오, 공백 만 입력하십시오. –

+0

정규식처럼 보이면 여기로 갈 수 있습니다. 다른 필드가있을 때 어떻게 알 수 있습니까? 그것을 나타 내기 위해 항상 둘 이상의 공간이 있습니까? – 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'을 사용하면 아무 것도 개선되지 않기 때문에'list'가 더 적절하다고 생각합니다. 인덱스를 사용하여 항목에 액세스하는 것은 목록에서도'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'}]