Лучший способ выбрать строку python, ошибка заголовка ZLIB - PullRequest
0 голосов
/ 31 января 2020

Я использую решение, данное в этом потоке S / O Более эффективный способ засечь строку . А именно,

import zlib, cPickle

def zdumps(obj):
  return zlib.compress(cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL),9)

def zloads(zstr):
  return cPickle.loads(zlib.decompress(zstr))  

Это работает, если я выгружаю всю строку в файл. Например:

with open("mystring.txt", "wb") as f:
     f.write(zdumps(MYBIGSTRING.encode()))

Затем я могу открыть файл с чем-то вроде

with open("mystring.txt", 'rb') as f:
   string_ = zloads(f.read()).decode("utf-8") 

. Это загружает все значения MYBIGSTRING в string_. Мои строки огромны, поэтому на моем ноутбуке 8 ГБ не хватает оперативной памяти.

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

Моя попытка сделать что-то вроде этого:

with open("mystring.txt", "wb") as f:
   f.write(zdumps("\n".encode()))
   f.write(zdumps(my_sub_string.encode()))

Закончив запись, я хочу прочитать ее по строкам и обработать каждую строку.

with open("mystring.txt", 'rb') as f:
   for line in f:
      my_sub_string_ = zloads(line).decode()

      # process my_sub_string

Но я получаю следующее сообщение об ошибке

zlib.error: Error -3 while decompressing data: incorrect header check

Как мне обойти это?

...