也许使用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