我有文本报告文件,我需要“split()”,就像字符串被分成数组一样。
所以文件就像:
BOBO:12341234123412341234 1234123412341234123412341 123412341234 BOBO:12349087609812340-98 43690871234509875 45 BOBO:32498714235908713248 0987235
我想在以“^ BOBO:”开头的行上创建3个子文件。我真的不想要3个物理文件,我更喜欢3个不同的文件指针。
答案 0 :(得分: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:”节一个。
答案 1 :(得分:1)
如果你可以处理将它们留在记忆中以便与它们一起工作,那么这样的事情可能会起作用:
subFileBlocks = []
with open('myReportFile.txt') as fh:
for line in fh:
if line.startswith('BOBO'):
subFileBlocks.append(line)
else:
subFileBlocks[-1] += line
在subFileBlocks的末尾应该包含你的部分作为字符串。