2014-11-07 4 views
0

Я использую библиотеку gzip python для расширения файлов, а некоторые из них повреждены. Точная ошибка заключается в следующем:Как извлечь данные из поврежденных файлов gzip в python

Ошибка -3, а распаковка: неверный блок типа

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

Благодаря

+1

Вы можете попробовать использовать 'os.system ('Gunzip из')', он должен извлекать данные до сбойного сектора. Но извлеките данные после плохого сектора - теперь я не нахожу надежного подхода. – serkos

+1

Автор 'gzip' [имеет это сказать] (http://www.gzip.org/recover.txt). Восстановление данных до того, как повреждение будет выполнено, как указано выше, предлагает @serkos. Восстановление данных после того, как выглядит жестко, и предлагаемый метод включает в себя редактирование 'c' источника gzip, который не является решением Python, которое вы ищете. – Tony

ответ

1

Вы можете использовать Python zlib interface распаковывать кусок в то время, которое даст вам распакованные данные до дефектного блока. Обратите внимание, что коррупция, вероятно, предшествует точке, где она была поймана, поэтому некоторая сумма в конце распакованных данных, которые вы получаете, может быть повреждена.

Восстановление данных после ошибки в значительной степени невозможно (см. Ссылку в комментарии к вопросу), если только файл gzip не был специально подготовлен для получения точек восстановления. Сама утилита gzip этого не делает.

2

Надеюсь, кто-то считает это полезным:

# http://stackoverflow.com/questions/2423866/python-decompressing-gzip-chunk-by-chunk 
# http://stackoverflow.com/questions/3122145/zlib-error-error-3-while-decompressing-incorrect-header-check/22310760 
def read_corrupted_file(filename, CHUNKSIZE=1024): 
    d = zlib.decompressobj(zlib.MAX_WBITS | 32) 
    with open(filename, 'rb') as f: 
     result_str = '' 
     buffer=f.read(CHUNKSIZE) 
     try: 
      while buffer: 
       result_str += d.decompress(buffer) 
       buffer=f.read(CHUNKSIZE) 
     except Exception as e: 
      print 'Error: %s -> %s' % (filename, e.message) 
     return result_str 
Смежные вопросы