0

特定の文字列セクションを解析するためにどのような手法/モジュールを使用しますか? 次のタイプの行を指定します。

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

フィールド名は常にコロンで終わります。フィールド値は空白にすることができ、フィールドはスペースのみで区切られます。フィールド値にアクセスしたいだけです。正規表現を使用してこれを行う方法は知っていますが、Python でこれを行うよりエレガントな方法があると確信しています。

4

3 に答える 3

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'                 
于 2013-05-26T20:40:38.910 に答える
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
''
于 2013-05-26T19:09:50.317 に答える
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'}]
于 2013-05-26T19:19:27.230 に答える