Есть ли эффективный способ разбора блоков текста в python?

У меня огромный файл (~ 70 ГБ) с строками, которые выглядят так:

$ cat mybigfile.txt 5 7 1 1 0 -2 0 0 2 0 4 0 -4 0 0 4 0 0 1 -1 0 0 0 0 0 0 0 1 0 -1 0 0 0 0 0 1 -1 5 8 -1 -1 -1 -1 -1 1 1 1 0 0 2 0 0 0 -1 -1 3 3 3 -1 -1 -1 -1 -1 -1 -1 -1 0 2 0 0 0 -1 1 -1 0 0 0 1 0 5 7 1 1 0 -2 0 0 5 0 2 0 -2 0 0 2 0 0 1 -1 0 0 0 0 0 0 0 1 0 -4 0 0 0 0 0 1 -4 5 7 1 1 0 -2 0 1 -1 0 2 0 -2 0 0 4 0 0 1 -1 0 0 0 0 0 0 0 1 0 -2 0 0 0 0 0 2 -4 

Я хочу разбить свой огромный файл на несколько менее громоздких файлов, организовав каждый блок последним символом в своем заголовке. Итак, запустив $ python magic.py mybigfile.txt должен создать два новых файла v07.txt и v08.txt

 $ cat v07.txt 5 7 1 1 0 -2 0 0 2 0 4 0 -4 0 0 4 0 0 1 -1 0 0 0 0 0 0 0 1 0 -1 0 0 0 0 0 1 -1 5 7 1 1 0 -2 0 0 5 0 2 0 -2 0 0 2 0 0 1 -1 0 0 0 0 0 0 0 1 0 -4 0 0 0 0 0 1 -4 5 7 1 1 0 -2 0 1 -1 0 2 0 -2 0 0 4 0 0 1 -1 0 0 0 0 0 0 0 1 0 -2 0 0 0 0 0 2 -4 $ cat v08.txt 5 8 -1 -1 -1 -1 -1 1 1 1 0 0 2 0 0 0 -1 -1 3 3 3 -1 -1 -1 -1 -1 -1 -1 -1 0 2 0 0 0 -1 1 -1 0 0 0 1 0 

Заголовки каждого блока имеют форму 5 i с i от i=6 до i=22 .

Это что-то вроде дела? Единственный язык, на котором я достаточно удобен, чтобы начать, – это python, поэтому, если возможно, я предпочел бы решение python.

Вот мое решение:

 from string import whitespace import sys class PolyBlock(object): def __init__(self, lines): self.lines = lines def nvertices(self): return self.lines[0].split()[-1] def outname(self): return 'v' + self.nvertices().zfill(2) + '.txt' def writelines(self): with open(self.outname(), 'a') as f: for line in self.lines: f.write(line) def __repr__(self): return ''.join(self.lines) def genblocks(): with open('5d.txt', 'r') as f: block = [next(f)] for line in f: if line[0] in whitespace: block.append(line) else: yield PolyBlock(block) block = [line] def main(): for block in genblocks(): block.writelines() sys.stdout.write(block.__repr__()) if __name__ == '__main__': main() 

Мои решения проходят через каждый блок и многократно открывают и закрывают файлы. Я подозреваю, что это может быть намного более эффективным, но я не уверен, как улучшить код.

One Solution collect form web for “Есть ли эффективный способ разбора блоков текста в python?”

если вы в порядке с awk-командой, попробуйте это …

 awk 'NF==2{filename="v0"$2".txt"}{print > filename}' mybigfile.txt 
  • chmod - изменить права доступа к файлу
  • Могу ли я перейти на новую версию Python на старой версии Ubuntu?
  • Простой текстовый редактор консоли, подходящий для python
  • Как контролировать открытие и закрытие файлов?
  • Почему conda не использует символические ссылки для дублирования зависимостей?
  • Python теперь считает, что аргументы являются файлами: Broken emerge, pip, livestreamer и большинство инструментов с использованием Python
  • FreeBSD: невозможно установить Python 2.7
  • Сделать PyCrust использовать Python 3
  • Запуск сценария python с терминала без расширения .py
  • В Debian, как я могу добавить пакет Python в dist-packages к virtualenv?
  • Ошибка при создании виртуальной среды с помощью venv
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.