2011-12-14 3 views
63

Как мне сжать сжатие строки в Python?Как мне сжать сжатие строки в Python?

gzip.GzipFile Существует, но это для файловых объектов - как насчет простых строк?

+7

Первый результат для 'python gzip' http://docs.python.org/library/gzip.html (возможно, вы могли бы попробовать немного?) – KevinDTimm

+0

@KevinDTimm, этот документ упоминает только 'StringIO', но делает не совсем объяснить, как это сделать. Поэтому, задавая этот вопрос, он полностью действителен, ИМХО. Однако еще несколько проб, прежде чем спросить и рассказать о них, было бы неплохо. – Alfe

+0

@Alfe - вопрос был закрыт 4 года назад по той же причине, что и мой комментарий - OP не предпринял никаких усилий для поиска в первую очередь. – KevinDTimm

ответ

2

Выберите подходящий модуль от http://docs.python.org/library/archiving.html - либо gzip, либо zlib, в зависимости от ваших конкретных потребностей.

+1

Я вижу, что zlib имеет несколько уровней сжатия. Каков уровень, который использует gzip? – bellpeace

+2

звонок, вы перешли по ссылке на документацию для gzip? «Аргумент уровня сжатия является целым числом от 1 до 9, контролирующим уровень сжатия: 1 является самым быстрым и производит наименьшее сжатие, а 9 является самым медленным и производит наибольшее сжатие. По умолчанию используется [УДАЛЕНО]». Я позволю вам проверить фактическое значение самостоятельно. :) –

+0

По умолчанию 9, самый медленный. –

52

Самый простой способ это zlibencoding:

compressed_value = s.encode("zlib") 

Затем распаковать его:

plain_string_again = compressed_value.decode("zlib") 
+3

- это строка? – dcousens

+1

@ Даниэль: Да, 's' является объектом Python 2.x типа' str'. –

+2

См. [Стандартные кодировки] (http://docs.python.org/2/library/codecs.html#standard-encodings), где он получил это (прокрутите вниз до __ "codecs" __). Также доступно: 's.encode ('rot13')', 's.encode ('base64')' – bobobobo

123

Если вы хотите, чтобы произвести полный gzip -совместимый двоичную строку с заголовком и т.д., вы можете использовать gzip.GzipFile вместе с StringIO:

import StringIO 
import gzip 
out = StringIO.StringIO() 
with gzip.GzipFile(fileobj=out, mode="w") as f: 
    f.write("This is mike number one, isn't this a lot of fun?") 
out.getvalue() 

# returns '\x1f\x8b\x08\x00\xbd\xbe\xe8N\x02\xff\x0b\xc9\xc8,V\x00\xa2\xdc\xcc\xecT\x85\xbc\xd2\xdc\xa4\xd4"\x85\xfc\xbcT\x1d\xa0X\x9ez\x89B\tH:Q!\'\xbfD!?M!\xad4\xcf\x1e\x00w\xd4\xea\xf41\x00\x00\x00' 
+4

Life-saver. Просто восхитительно. Я знаю, что это старо, но спасибо! –

+15

Это должен быть принятый ответ. – ForeverWintr

+2

Противоположность этого является: 'Защита gunzip_text (текст): входной_файла = StringIO.StringIO() infile.write (текст) с gzip.GzipFile (fileobj = входной_файл, режим = "г"), как F: е .rewind() f.read() return out.getvalue() – fastmultiplication

-5
s = "a long string of characters" 

g = gzip.open('gzipfilename.gz', 'w', 5) # ('filename', 'read/write mode', compression level) 
g.write(s) 
g.close() 
+3

Я предполагаю, что речь шла о сжатии строки в памяти без необходимости записывать ее на диск в процессе. В противном случае ваш ответ будет абсолютно правильным. – Alfe

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