2015-02-18 3 views
1

Предположим, у меня есть несколько данных: скажем, 3 python array s (или numpy array s) и 2 списка строк.python сжатие нескольких данных с использованием gzip или zlib

Как хранить каждую из данных в сжатом двоичном формате в одном и том же zip-файле?

Я посмотрел на документацию на https://docs.python.org/3.4/library/gzip.html и примеры просто показал, как написать один данные, которые используют gzip.open, чтобы открыть файл, и writelines выписывать отдельные данные.

Я использую Python 3.4

ответ

1

Чтобы поместить несколько файлов в сжатых файлах, используйте tarfile.open с режимом w:gz. Затем вы можете использовать метод addfile для размещения в него сериализованных объектов (используя StringIO в качестве файла).

import numpy 
np_array_data = numpy.zeros(100) 
list_of_strs = ['abc'] * 100 

import io 
import pickle 

np_array_data = io.BytesIO() 
numpy.save(np_array_data, np_array) 
np_array_data.seek(0) 
str_data = io.BytesIO() 
pickle.dump(list_of_strs, str_data) 
str_data.seek(0) 
with tarfile.open('output.tar.gz', mode='w:gz') as dest_file: 
    dest_file.addfile(tarfile.TarInfo('np_data'), np_array_data) 
    dest_file.addfile(tarfile.TarInfo('str_data'), str_data) 

Если вы только хотели поставить ряд Numpy массивов в сжатый файл, вы могли бы просто использовать numpy.savez_compressed.

+0

будет «tarfile» работать с MS Windows? – uday

+0

Конечно! Хотя вам нужно подумать о том, кто будет открывать файлы. Если это еще один скрипт Python, я не думаю, что есть какие-либо проблемы с платформой - zlib является кросс-платформенным. Просто убедитесь, что вы используете двоичный режим при записи файла. – babbageclunk

+0

было бы возможно привести пример сериализации массива numpy и списка строк? – uday

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