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

awk 非常适合:

$ awk '/^#/{gsub(/#/,"");printf "%s",NR!=1?"\n"$0:$0;next}{print "\t"$0}' file
John    someData1
        someData2
        SomeData3

Mike    someData1
        someData2

Ford    someData1
        someData2
        SomeData3
        someData4
        someData5
        SomeData6

似乎awkonMac不支持三元运算符? :,因此请改用此Mac友好版本:

$ awk '/^#/{gsub(/#/,"");printf n"%s",$0;n="\n";next}{print "\t"$0}' file 
于 2013-04-08T15:26:22.570 回答
2

一种迭代工具方法:

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 回答