也許使用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:」節。
你不必爲'fh.readlines()'中的行做'。 '對於fh'行來說足夠了。 – aaronasterling 2010-09-04 01:40:22
,並且在任何給定的時間將實際上保留整個文件內存不足。 – aaronasterling 2010-09-04 01:54:53
@aaronasterling - 'fh'中的行可能使文件不在內存中(或者至少一次只加載一行),但是我的方法是將它讀入列表中,該列表在文件句柄完成時將存在。那是我的「如果你不介意它在記憶中」的評論來自。感謝您的優化,但! – 2010-09-04 05:33:29