2010-09-03 100 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:」節。