Распаковка файлов из архивов zip или tar.gz с помощью Python

Перевод статьи Read/unzip File(s) from Zip Or Tar.gz With Python от John D K.

cat box1

Из этой статьи вы узнаете, как распаковать один или несколько архивов zip и tar.gz и получить информацию о них средствами языка Python. Мы рассмотрим извлечение одного или нескольких файлов из архива.

Шаг 1: получить информацию из архива zip или tar.gz

Сперва мы просмотрим содержимое zip-файла с помощью этого фрагмента кода:

from zipfile import ZipFile

zipfile = 'file.zip'

z = ZipFile(zipfile)
z.infolist()

Результат:

[<ZipInfo filename='file/pandas-dataframe-background-color-based-condition-value-python.png' compress_type=deflate external_attr=0x20 file_size=32152 compress_size=31441>,
 <ZipInfo filename='file/text1.txt.txt' external_attr=0x20 file_size=0>]

Таким образом мы сможем узнать размеры и имена двух файлов:

  • pandas-dataframe-background-color-based-condition-value-python.png
  • text1.txt

Шаг 2: перечислить и прочитать все файлы из архива

Теперь мы можем получить список всех файлов в архиве:

from zipfile import ZipFile

archive = 'file.zip'

zip_file = ZipFile(archive)
[text_file.filename for text_file in zip_file.infolist() ]

Результат:

['pandas-dataframe-background-color-based-condition-value-python.png',
'text1.txt']

Если вам нужно отсортировать файлы – например, получить только json – или прочитать их в формате датафреймов Pandas, можно сделать это следующим образом:

from zipfile import ZipFile

archive = 'file.zip'

zip_file = ZipFile(archive)
dfs = {text_file.filename: pd.read_csv(zip_file.open(text_file.filename))
       for text_file in zip_file.infolist()
       if text_file.filename.endswith('.json')}
dfs

Шаг 3: извлечь файлы из zip-архива

Пакет zipfile  можно использовать для извлечения файлов из zip-архивов. Базовый пример:

import zipfile

archive = 'file.zip'

with zipfile.ZipFile(archive, 'r') as zip_file:
    zip_file.extractall(directory_to_extract_to)

Шаг 4: извлечь файлы из tar/tar.gz

Чтобы извлечь файлы из архивов tar/tar.gz, можно воспользоваться кодом, приведенным ниже. Он использует модуль tarfileи разделяет эти два типа, чтобы применить подходящий режим распаковки:

import tarfile

zipfile = 'file.zip'

if zipfile.endswith("tar.gz"):
    tar = tarfile.open(zipfile, "r:gz")
elif zipfile.endswith("tar"):
    tar = tarfile.open(zipfile, "r:")

tar.extractall()
tar.close()

Примечание: все файлы из архива будут распакованы в текущей для данного скрипта рабочей директории.

Шаг 5: извлечь один файл из архива

Если вам нужно получить только один файл из архива, можно использовать методzipObject.extract(fileName, 'temp_py'). Простой пример:

import zipfile

archive = 'file.zip'

with zipfile.ZipFile(archive, 'r') as zip_file:
    zip_file.extract('text1.txt', '.')

В этом примере мы извлечём файл 'text1.txt' в текущую рабочую директорию. Если вам нужно извлечь файл в другую директорию, можете изменить второй параметр — '.'

Заключение

В этом уроке мы выяснили, как с помощью Python извлечь один или несколько файлов из различных архивов, а также — как вывести список запакованных файлов и получить из них информацию. Мы затронули работу с двумя пакетами: zipfile и tarfile.