Записать данные gzipped-уже в файл - PullRequest
0 голосов
/ 12 июня 2011

У меня есть база данных с некоторыми данными в двоичном виде (тип данных blob в MySQL), которая на самом деле была уничтожена и распакована.Теперь я хочу извлечь их и записать каждую запись в файл gzip, который я бы предположил, чтобы быть выполнимым - после того, как все они gzipped-данные правильно?

Вопрос, однако, как мне это сделать?В результате поиска я смог найти миллион примеров того, как записать файл gzip из оригинальных данных, а не из архива gzip.Запись gzip-строки непосредственно в файл не приводит к gzip-файлу, не говоря уже о том, что у меня получилось множество исключений «порядковый номер не в диапазоне».

Не могли бы вы, ребята, помочь?Заранее спасибо.Я новичок в Python ...

Редактировать: Вот метод, который я использовал:

def store_cache(self, content, news_id):
        if not content:
            return
        # some of the records may contain normal data (not gzipp-ed), hence this try block
        try:
            content = self.gunzip(content)
        except:
            return

        import gzip
        with gzip.open('static/cache/%s' % (self.base36encode(news_id), ), 'wb') as f:
            f.write(content)
            f.close()

Это вызывает исключение:

<type 'exceptions.UnicodeEncodeError'> at /migrate
'ascii' codec can't encode character u'\u1edb' in position 186: ordinal not in range(128)

И этоявляется самой внутренней трассировкой:

E:\Python27\lib\gzip.py in write
            self.crc = zlib.crc32(data, self.crc) & 0xffffffffL 

1 Ответ

0 голосов
/ 12 июня 2011

Вы сказали это сами: распакуйте их и запишите их в файл gzip. Нет ничего особенного в записи «из данных gzipped»: вы распаковываете данные, чтобы получить исходные данные, а затем записываете исходные данные, как если бы они были исходными данными (потому что они есть). Документация показывает вам, как это сделать.

Однако gzip - это просто формат сжатия, а не формат архива. Он не предназначен для обработки нескольких файлов, поэтому вы должны использовать что-то еще для создания одного файла из нескольких входов. Обычно это делается путем создания архива tar, который затем распаковывается. Вы можете сделать это в Python, используя модуль tarfile. Поскольку ваши данные будут поступать из потоков gzip-декомпрессии, вы захотите использовать метод TarFile.addfile(tarinfo, fileobj), чтобы добавить их в архив. Вы должны иметь возможность использовать экземпляр gzip.GzipFile в качестве fileobj, чтобы добавить этот путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...