2010-09-03 103 views
3

我有文本报告文件,我需要“拆分()”就像字符串被分成数组。根据字符串拆分操作的行将文本文件分解为块?

所以该文件是这样的:

 
BOBO:12341234123412341234 
1234123412341234123412341 
123412341234 
BOBO:12349087609812340-98 
43690871234509875 
45 

BOBO:32498714235908713248 
0987235 

而且我想在打头的行创建3个子文件指出,分裂的“^ BOBO”。我真的不想要3个物理文件,我更喜欢3个不同的文件指针。

回答

1

如果你能处理保持在内存中,与他们合作,这样的事情可能工作:

subFileBlocks = [] 

with open('myReportFile.txt') as fh: 
    for line in fh: 
    if line.startswith('BOBO'): 
     subFileBlocks.append(line) 
    else: 
     subFileBlocks[-1] += line 

在那subFileBlocks应该包含您的部分作为字符串结束。

+1

你不必为'fh.readlines()'中的行做'。 '对于fh'行来说足够了。 – aaronasterling 2010-09-04 01:40:22

+0

,并且在任何给定的时间将实际上保留整个文件内存不足。 – aaronasterling 2010-09-04 01:54:53

+0

@aaronasterling - 'fh'中的行可能使文件不在内存中(或者至少一次只加载一行),但是我的方法是将它读入列表中,该列表在文件句柄完成时将存在。那是我的“如果你不介意它在记忆中”的评论来自。感谢您的优化,但! – 2010-09-04 05:33:29

3

也许使用itertools.groupby

import itertools 

def bobo(x):  
    if x.startswith('BOBO:'): 
     bobo.count+=1 
    return bobo.count 
bobo.count=0 

with open('a') as f: 
    for key,grp in itertools.groupby(f,bobo): 
     print(key,list(grp)) 

产量:

(1, ['BOBO:12341234123412341234\n', '1234123412341234123412341\n', '123412341234\n']) 
(2, ['BOBO:12349087609812340-98\n', '43690871234509875\n', '45\n', '\n']) 
(3, ['BOBO:32498714235908713248\n', '0987235\n']) 

既然你说你不想要的物理文件,整个文件必须能适应在内存中。在这种情况下,创建类似文件的对象,请使用cStringIO模块:

import cStringIO 
with open('a') as f: 
    file_handles=[] 
    for key,grp in itertools.groupby(f,bobo): 
     file_handles.append(cStringIO.StringIO(''.join(grp))) 

file_handles将类文件对象的列表,每个“BOBO:”节。