Python 将一列拆分为两列

Python 将一列拆分为两列,python,bash,awk,Python,Bash,Awk,我的数据格式如下: ###John### someData1 someData2 SomeData3 ###Mike### someData1 someData2 ###Ford### someData1 someData2 SomeData3 someData4 someData5 SomeData6 我希望输出为: John someData1 someData2 someData3 Mike someData1 someData2 Ford

我的数据格式如下:

###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?
是一个单词。关于如何实现这一点,有什么想法吗?

我会使用以下方法:

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)

这将在第一行为您提供一个额外的换行符,但如果您真的愿意,可以很容易地将其删除。

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
似乎
Mac
上的
awk
不支持三值运算符
?:因此请改用此
Mac
友好版本:

$ awk '/^#/{gsub(/#/,"");printf n"%s",$0;n="\n";next}{print "\t"$0}' file 

您可以通过重新拆分轻松拆分数据

import re
namesInfo = re.split('###(.*?)###', dataString)
然后得到一个名称数组,后跟相关数据。 然后,您可以解析每个名称的数据。

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

以下给出了所需的精确输出:

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

或者使用
x.strip('#')
而不是
.replace()
:-)是否确实有效?它向我抛出一个错误,在源代码第1行说
语法错误/^#/{gsub(/#/,“”);printf>>>>%s”,NR!=请尽可能确定,看看这里您在哪个平台上,您有什么版本的
awk
吗?
$awk-version
提供了awk版本20070501。它仍然会给我同样的错误。您似乎有旧的/坏的
awk
您在Solaris上吗?您需要使用
/usr/xpg4/bin/awk
。@Sunil有趣的是,我记录的在mac机器中,它不喜欢三元运算符,我已经添加了一个mac友好的答案,但我建议您安装
GNU awk
:]组之间不要用空行分隔。@sunil然后只添加一个
print
-不能在mo的移动设备上编辑帖子