Поиск исходного имени файла при распаковке файлов gzip в python - PullRequest
0 голосов
/ 04 февраля 2020

Довольно давно go a YouTuber опубликовал загадку и попросил свое сообщество решить ее. Я уже решил эту головоломку, но я вспомнил ее часть, для которой я всегда хотел автоматизировать скрипт в python. Это в основном файл, который был случайно заархивирован более 10000 раз. Кто-то написал сценарий, который случайным образом архивирует файл разными способами. (.zip, .rar, .jar, .tar. tar.gz, .gz и .7z) Я смог без проблем извлечь все эти типы файлов, кроме файлов .gz. Файлы tar.gz прекрасно распаковываются с помощью модуля tarfile, но обычные файлы .gz, по-видимому, невозможно извлечь. Мне удается успешно распаковать файл, но все, что мне дает, это необработанные байтовые данные.

Итак, вот что я пытаюсь сделать:

Мне нужно извлечь содержимое простого файла .gz (не tar.gz) в python, как если бы я открывал семь zip-архивов и распаковал их GUI.

Некоторые вещи, которые следует упомянуть:

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

  2. Мне нужно оригинальное имя файла заархивированного элемента. Мне удалось извлечь .zip из одного из файлов .gz, но он работал, только если я сделал это:

     from gzip import open as gzopen
     with gzopen(file_name, 'rb') as f_in:
         with open('file.zip', 'wb') as f_out:
            copyfileobj(f_in, f_out)
    

    Проблема в том, что он всегда будет извлекать .gz как file.zip, даже если фактический файл был заархивирован .7z или .rar. Мне нужно, чтобы он правильно определил тип расширения и назвал его соответствующим образом.

1 Ответ

0 голосов
/ 06 марта 2020

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

Итак, если gzip в качестве исполняемого файла сжимает файл, он просто сжимает содержимое файла и оставляет все остальное (владелец, даты и т. Д. c.) неповрежденными. За исключением имени: к нему добавляется суффикс .gz.

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

Конечно, gzip также может использоваться для сжатия других потоков, например, ввода пользователя или вывода команды. Если у него нет файла под рукой, он направит сжатый поток байтов в стандартный вывод, откуда он может быть снова перенаправлен в некоторый файл. И этот файл может снова иметь суффикс .gz (и часто имеет). Таким образом, файл, имя которого заканчивается на .gz, не обязательно является сжатой версией файла с таким именем без суффикса .gz.

Некоторые комбинации суффиксов часто сокращаются, например, .tar.gz часто называют .tgz.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...