Получите несжатый размер .gz файла в Python

Это, вероятно, не всегда быстрее, но более оптимистично относительно этого, Вы находите большой главный делитель:

  1. N Ваш номер
  2. , Если это является главным тогда return(N)
  3. , Вычисляют, начала вплоть до Sqrt(N)
  4. Проходят начала в порядке убывания (самый большой первый)
    • Если N is divisible by Prime тогда Return(Prime)

Редактирование: На шаге 3 можно использовать Решето Эратосфена или Решето Atkins или независимо от того, что Вам нравится, но отдельно решето не найдет Вас самым большим простым множителем. (Thats, почему я не выбрал бы сообщение SQLMenace's в качестве официального ответа...)

12
задан Paul Oyster 9 November 2009 в 22:43
поделиться

5 ответов

Формат gzip определяет поле с именем ISIZE , которое:

Содержит размер исходных (несжатых) входных данных по модулю 2 ^ 32.

В gzip .py , который, как я полагаю, используется для поддержки gzip, существует метод под названием _read_eof , определенный как таковой:

def _read_eof(self):
    # We've read to the end of the file, so we have to rewind in order
    # to reread the 8 bytes containing the CRC and the file size.
    # We check the that the computed CRC and size of the
    # uncompressed data matches the stored values.  Note that the size
    # stored is the true file size mod 2**32.
    self.fileobj.seek(-8, 1)
    crc32 = read32(self.fileobj)
    isize = U32(read32(self.fileobj))   # may exceed 2GB
    if U32(crc32) != U32(self.crc):
        raise IOError, "CRC check failed"
    elif isize != LOWU32(self.size):
        raise IOError, "Incorrect length of data produced"

Здесь вы можете увидеть, что ISIZE читается, но только для того, чтобы сравнить его с self.size для обнаружения ошибок. Тогда это должно означать, что GzipFile. size хранит фактический размер без сжатия. Однако я думаю, что он не раскрывается публично, поэтому вам, возможно, придется взломать его, чтобы раскрыть его. Не совсем уверен, извините.

Я только что просмотрел все это прямо сейчас и не пробовал, поэтому могу ошибаться. Я надеюсь, что это будет вам полезно. Извините, если я неправильно понял ваш вопрос.

13
ответ дан 2 December 2019 в 03:48
поделиться

Способ Unix: используйте "gunzip -l file.gz" через subprocess.call / os.popen, захватите и проанализируйте его вывод.

4
ответ дан 2 December 2019 в 03:48
поделиться

Последние 4 байта .gz содержат исходный размер файла

4
ответ дан 2 December 2019 в 03:48
поделиться

Глядя на источник модуля gzip , я вижу, что базовый файловый объект для GzipFile выглядит как fileobj . Итак:

mygzipfile = gzip.GzipFile()
...
mygzipfile.fileobj.tell()

?

Может быть, перед этим было бы неплохо провести некоторую проверку работоспособности, например, проверить наличие атрибута с помощью hasattr .

Не совсем публичный API, но ...

0
ответ дан 2 December 2019 в 03:48
поделиться

GzipFile.size хранит несжатый размер, но он увеличивается только при чтении файла, поэтому вам следует предпочесть len (fd.read ()) вместо закрытого GzipFile.size.

0
ответ дан 2 December 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: