2010-09-03 4 views
3

У меня есть текстовые файлы отчетов Мне нужно «split()», так как строки разбиваются на массивы.Разбить текстовый файл на куски на основе строки, как операция разделения строк?

Так файл как:

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

BOBO:32498714235908713248 
0987235 

И я хочу, чтобы создать 3 суб-файлы из этого разбиения на строки, которые начинаются с «^ БОБО:». Я действительно не хочу 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

+0

и фактически сохранит весь файл в памяти в любой момент времени. – aaronasterling

+0

@aaronasterling - 'for line in fh' может оставить файл не в памяти (или, по крайней мере, только загружать строку за раз), но мой подход читает его в список, который будет существовать, когда обрабатывается дескриптор файла. Это был мой «если вы не против, чтобы это было в памяти». Спасибо за оптимизацию, хотя! –

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 будет список файлов типа объектов, один для каждого «БОБО:» строфа.

Смежные вопросы