2013-12-17 5 views
20

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

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 файлы находятся в правильном месте, и я могу напечатать полный путь + имя файла с помощью команды печати , но модуль GZIP не выполняется надлежащим образом. что мне не хватает?

+0

является файлом нормально? Вы не показываете, что это/не происходит. –

+0

Да, файл в порядке. Я могу распаковать файл, используя gunzip в командной строке UNIX. – user3111358

ответ

37

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

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

Модуль gzip не работает как программа настольного архивирования, как 7-Zip - вы не можете «распаковывать» файл без «чтения». То, что вы, вероятно, подразумеваете под «uncompress», более точно описано - с точки зрения программирования - как «читать поток из сжатого файла и записывать его в новый файл».

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

Здесь вы просто читаете поток. Вам просто нужно записать его в новый файл:

inF = gzip.open(file, 'rb') 
outF = open(outfilename, 'wb') 
outF.write(inF.read()) 
inF.close() 
outF.close() 
+0

Ошибка при запуске скрипта Python, но файл gzip не несжатый. Я только хочу распаковать файл, чтобы его можно было использовать другим инструментом, не переписанным в файл или другим в моем сценарии. – user3111358

+1

@ user3111358 Что означает, * точно *, «файл gzip не несжатый»? Почему вы так говорите? Вы проверили содержимое 's' в своем коде? – goncalopp

+0

Я имею в виду, что файл gzip не несжатый, и это то, что я пытаюсь сделать. Я ТОЛЬКО хочу расстегнуть, ничего больше. – user3111358

5

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

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

  1. вам нужно, чтобы хранить распакованные данные в s в какой-то файл.

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

  3. Вы используете 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) 
+0

Когда вы вызываете 'open (uncompressed_path, 'w'). Write (s)' без назначения обработчика файла переменной, нет необходимости закрывать обработчик файла? – Ander

+1

@Ander - да, потому что (анонимный) файловый объект никогда не будет привязан к переменной, и поэтому он будет уничтожен сразу после его выполнения. Я нахожу его более чистым для простых «писать xy в файл» или «читать из файла» - то есть, когда есть _exactly_ один читать или писать. Но если вы делаете более одного чтения/записи, вы, вероятно, должны всегда использовать 'with open (...):' –

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 был слишком сложным для того, что я пытался выполнить.

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

6

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

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' вариант для открытия файлов.

+0

Было бы лучше использовать 'os.path.splitext (gzip_fname) [0]', чтобы удалить ' .gz' extension –

+0

Ваш пример неправильный, 'gzip_fname' не существует, вы должны изменить его на' gzip_path'. Кроме того, то, что вы попадаете в 'gzip_path', не является контуром, это файл gz. Поэтому вы должны изменить 'os.path.isdir' на' os.path.isfile'. Я также считаю, что использовать решение @gotson лучше :) –

0

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

import glob 
from setuptools import archive_util 

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

Archive_util.unpack_archive, похоже, не поддерживает .gz. Сообщение об ошибке «setuptools.archive_util.UnrecognizedFormat: не распознанный тип архива: K: \ z_temp \ file.gz». Также shutil.upack_archive не поддерживает .gz. Чтобы просмотреть поддерживаемые типы файлов для shutil_unpack_archive: 'import shutil; печать (shutil.get_archive_formats()) ' – punchcard

Смежные вопросы