Использование модуля 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 не будет выполнен правильно. что мне не хватает?
Ответы
Ответ 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, '.')