3

私が持っているデータ形式は次のとおりです。

###John###
someData1
someData2
SomeData3
###Mike###
someData1
someData2
###Ford###
someData1
someData2
SomeData3
someData4
someData5
SomeData6

出力を次のようにしたい:

John  someData1
      someData2
      someData3

Mike  someData1
      someData2

Ford  someData1
      someData2
      someData3
      someData4
      someData5
      someData6

ここでの問題は、各名前の下にあるデータ(somedata?)の数が異なり、事前にわかっていないことです。私が取り組まなければならない唯一の部分は###、新しい名前の始まりを意味する主要な文字です.

Somedata?は一言です。これを達成する方法について何か考えはありますか?

4

5 に答える 5

3

私は次のようなものを使用します:

def fixup(iterable):
    it = iter(iterable)
    for x in it:
        if x.startswith('###'):
            yield '\n{0}\t{1}'.format(x.strip('#'),next(it))
        else:
            yield '\t{0}'.format(x)

これにより、最初の行に余分な改行が追加されますが、必要に応じて簡単に削除できます。

于 2013-04-08T15:24:27.413 に答える
2

itertools アプローチ:

from itertools import groupby

with open('yourfile') as fin:
    for k, g in groupby(fin, lambda L: L.startswith('###')):
        if k:
            name = next(g).strip('#\n')
        else:
            print '{}\t{}'.format(name, next(g)),
            for line in g:
                print '\t{}'.format(line),
            print
于 2013-04-08T15:39:16.933 に答える
1

以下は、必要な正確な出力を示しています。

from sys import stdout

with open('file') as f:
    for n,line in enumerate(f):        
        if line.startswith('###'):            
            stdout.write(('' if not n else '\n')+line.strip('#\n'))
        else:
            stdout.write('\t'+line)

出力:

John    someData1
        someData2
        SomeData3

Mike    someData1
        someData2

Ford    someData1
        someData2
        SomeData3
        someData4
        someData5
        SomeData6
于 2013-04-08T17:20:55.820 に答える
0

re.split でデータを簡単に分割できます

import re
namesInfo = re.split('###(.*?)###', dataString)

次に、関連するデータが後に続く名前の配列を取得します。次に、各名前のデータを解析できます。

于 2013-04-08T15:30:48.847 に答える