2015-02-19 3 views
0

У меня есть файл данных, где каждая строка имеет разделитель \n\n\n. Мое решение выделить эти строки сначала прихлебывая файл, а затем расщепление строк:Обработка потока файлов в python

for row in slurped_file.split('\n\n\n'): 
    ... 

Есть ли «awk -как» подход, который я мог бы предпринять, чтобы разобрать файл в виде потока в Python 2.7.9, и разделить линии в соответствии с заданным значением строки? Благодарю.

+0

Существует ли конкретная причина, по которой метод 'file.read (num_bytes)' не работает для вас? Просто пытаюсь лучше понять требования. Кажется, ленивый генератор, основанный на чтении байтов в буфере, и создание разделяемых строк идеально подходит для этого. – aruisdante

+0

Существует ошибка [ошибка/функция] (http://bugs.python.org/issue1152248) для добавления такой информации в стандартную библиотеку Python; см. также [этот вопрос] (http://stackoverflow.com/questions/19600475/how-to-read-records-terminated-by-custom-separator-from-file-in-python), но есть более легкое обходное решение слишком. –

+0

'\ n \ n \ n' делит большие блоки данных (которые поместится в памяти, но я заранее не знаю размер этих блоков). – user2105469

ответ

1

Так что в стандартной библиотеке нет такой вещи. Но мы можем сделать пользовательский генератор перебрать такие записи:

def chunk_iterator(iterable): 
    chunk = [] 
    empty_lines = 0 
    for line in iterable: 
     chunk.append(line) 
     if line == '\n': 
      empty_lines += 1 
      if empty_lines == 2: 
       yield ''.join(chunk[:-2]) 
       empty_lines, chunk = 0, [] 
     else: 
      empty_lines = 0 

    yield ''.join(chunk) 

Используйте как:

with open('filename') as f: 
    for chunk in chunk_iterator(f): 
     ... 

Это будет использовать итерацию на строку из файла, написанный на C в CPython и, таким образом, быстрее общее решение разделителя записей.

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