如何根据行将文本文件分块,如同字符串分割操作?

3 投票
2 回答
3812 浏览
提问于 2025-04-16 03:41

我有一些文本报告文件,我需要像处理字符串那样,把它们“分割”成数组。

这个文件的内容大概是这样的:

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

BOBO:32498714235908713248
0987235

我想根据以“^BOBO:”开头的行,把这个文件分成3个子文件。不过,我其实不想要3个实际存在的文件,我更希望有3个不同的文件指针来处理它们。

2 个回答

1

如果你能把它们保存在内存中来处理,那么像下面这样可能就能奏效:

subFileBlocks = []

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

到最后,subFileBlocks 应该会包含你的各个部分,都是以字符串的形式存在。

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:" 的段落。

撰写回答