Подтвердить что ты не робот

Использование модуля GZIP с Python

Я пытаюсь использовать модуль Python GZIP, чтобы просто распаковать несколько .gz файлов в каталог. Обратите внимание, что я не хочу читать файлы, а только их распаковать. После некоторого поиска этого сайта у меня есть этот сегмент кода, но он не работает:

import gzip
import glob
import os
for file in glob.glob(PATH_TO_FILE + "/*.gz"):
    #print file
    if os.path.isdir(file) == False:
        shutil.copy(file, FILE_DIR)
        # uncompress the file
        inF = gzip.open(file, 'rb')
        s = inF.read()
        inF.close()

.gz файлы находятся в правильном месте, и я могу напечатать полный путь + имя файла командой print, но модуль GZIP не будет выполнен правильно. что мне не хватает?

4b9b3361

Ответ 1

Если вы не получили ошибку, вероятно, модуль gzip выполняется правильно, а файл уже распаковывается.

Точное определение "распакованный" зависит от контекста:

Я не хочу читать файлы, только распаковать их

Модуль gzip не работает как настольная программа архивирования, такая как 7-zip - вы не можете "распаковать" файл, не "прочитав" его. Обратите внимание, что "чтение" (в программировании) обычно означает "сохранение (временно) в оперативной памяти компьютера", а не "открытие файла в графическом интерфейсе".

То, что вы, вероятно, подразумеваете под "распаковкой" (как в программе архивации на рабочем столе), более точно (в программировании) описывается как "чтение потока/буфера в памяти из сжатого файла и запись его в новый файл".

inF = gzip.open(file, 'rb')
s = inF.read()
inF.close()

С этими строками вы просто читаете поток. Если вы ожидаете, что будет создан новый "несжатый" файл, вам просто нужно записать буфер в новый файл:

with open(out_filename, 'wb') as out_file:
    out_file.write(s)

Ответ 2

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

import gzip
import glob
import os
import os.path

for gzip_path in glob.glob("%s/*.gz" % PATH_TO_FILE):
    if not os.path.isdir(gzip_path):
        with gzip.open(gzip_path, 'rb') as in_file:
            s = in_file.read()

        # Now store the uncompressed data
        path_to_store = gzip_fname[:-3]  # remove the '.gz' from the filename

        # store uncompressed file data from 's' variable
        with open(path_to_store, 'w') as f:
            f.write(s)

В зависимости от того, что именно вы хотите сделать, вы можете посмотреть tarfile и его опцию 'r:gz' для открытия файлы.

Ответ 3

Вы декомпрессируете файл в переменной s и ничего не делаете с ним. Вам следует прекратить поиск stackoverflow и прочитать хотя бы учебник по python. Серьезно.

Во всяком случае, в коде есть несколько вещей:

  • вам нужно STORE распаковать данные в s в некоторый файл.

  • нет необходимости копировать фактические файлы *.gz. Потому что в вашем коде вы распаковываете исходный файл gzip, а не копию.

  • вы используете file, который является зарезервированным словом, в качестве переменной. Это не ошибка, просто очень плохая практика.

Это, вероятно, должно делать то, что вы хотели:

import gzip
import glob
import os
import os.path

for gzip_path in glob.glob(PATH_TO_FILE + "/*.gz"):
    if os.path.isdir(gzip_path) == False:
        inF = gzip.open(gzip_path, 'rb')
        # uncompress the gzip_path INTO THE 's' variable
        s = inF.read()
        inF.close()

        # get gzip filename (without directories)
        gzip_fname = os.path.basename(gzip_path)
        # get original filename (remove 3 characters from the end: ".gz")
        fname = gzip_fname[:-3]
        uncompressed_path = os.path.join(FILE_DIR, fname)

        # store uncompressed file data from 's' variable
        open(uncompressed_path, 'w').write(s)

Ответ 4

Мне удалось решить эту проблему, используя модуль подпроцесса:

for file in glob.glob(PATH_TO_FILE + "/*.gz"):
    if os.path.isdir(file) == False:
        shutil.copy(file, FILE_DIR)
        # uncompress the file
        subprocess.call(["gunzip", FILE_DIR + "/" + os.path.basename(file)])

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

Спасибо за помощь. Это очень ценится!

Ответ 5

Я думаю, что есть гораздо более простое решение, чем остальные, представленные op, только хотели извлечь все файлы в каталог:

import glob
from setuptools import archive_util

for fn in glob.glob('*.gz'):
  archive_util.unpack_archive(fn, '.')