我的数据格式如下:
###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?
是一个单词。关于如何做到这一点的任何想法?
答案 0 :(得分: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)
这会在第一行给你一个额外的换行符,但如果你真的想这样就可以轻易删除。
答案 1 :(得分: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
awk
上的Mac
似乎不支持三元运算符? :
所以请使用此Mac
友好版本:
$ awk '/^#/{gsub(/#/,"");printf n"%s",$0;n="\n";next}{print "\t"$0}' file
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分:0)
您可以使用re.split轻松拆分数据
import re
namesInfo = re.split('###(.*?)###', dataString)
然后你得到一个名字数组,后跟相关的数据。 然后,您可以解析每个名称的数据。