파이썬에서 문자열을 gzip으로 압축하는 방법은 무엇입니까?


86

파이썬에서 문자열을 gzip으로 압축하는 방법은 무엇입니까?

gzip.GzipFile 존재하지만 그것은 파일 객체에 대한 것입니다-일반 문자열은 어떻습니까?


1
@KevinDTimm, 그 문서는 언급 할 StringIO뿐 실제로 어떻게 하는지를 설명하지는 않습니다. 그래서 여기서 그 질문을하는 것은 완전히 타당합니다, IMHO. 그러나 그들에 대해 물어보고 말하기 전에 더 많은 시련이 있었으면 좋았을 것입니다.
에 AlFe

@Alfe-질문은 내 의견과 거의 같은 이유로 4 년 전에 마감되었습니다. OP는 먼저 검색하려고 노력하지 않았습니다.
KevinDTimm 2015 년

4
어떻게이 주제에서 벗어 났습니까?

2
이 질문은 현재 Google에서 가장 인기있는 질문이며 gzip string in python매우 합리적인 IMO입니다. 다시 열어야합니다.
Garrett

2
위와 같이이 질문은 Google 검색의 최상위 결과이며 답변 중 하나가 맞습니다. 실제로 닫아서는 안되는 것처럼 보입니다.
darkdan21

답변:


156

gzip헤더 등 을 사용하여 완벽하게 호환되는 이진 문자열 을 생성 하려면 다음 gzip.GzipFile과 함께 사용할 수 있습니다 StringIO.

try:
    from StringIO import StringIO  # Python 2.7
except ImportError:
    from io import StringIO  # Python 3.x
import gzip
out = 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'

2
그 반대는 다음과 같습니다.`def gunzip_text (text) : infile = StringIO.StringIO () infile.write (text) with gzip.GzipFile (fileobj = infile, mode = "r") as f : f.rewind () f .read () return out.getvalue ()
fastmultiplication 2014

3
@fastmultiplication : 이하 :f = gzip.GzipFile(StringIO.StringIO(text)); result = f.read(); f.close(); return result
에 AlFe

2
나는 새로운 답을 할 수는 없지만 불행하게도, 문제는, 가까운되었습니다 여기는 파이썬 3에서이 작업을 수행하는 방법입니다
개렛

아마도 관련이 없을 것입니다. 먼저 메모리에서 압축하는 것이 더 빠릅니까 (로컬 디스크 사용)?
user3226167

1
Python 3 :import zlib; my_string = "hello world"; my_bytes = zlib.compress(my_string.encode('utf-8')); my_hex = my_bytes.hex(); my_bytes2 = bytes.fromhex(my_hex); my_string2 = zlib.decompress(my_bytes); assert my_string == my_string2;
ostrokach

64

가장 쉬운 방법은 zlib 인코딩입니다 .

compressed_value = s.encode("zlib")

그런 다음 다음을 사용하여 압축을 풉니 다.

plain_string_again = compressed_value.decode("zlib")

1
@Daniel : 예, s유형의 Python 2.x 객체입니다 str.
Sven Marnach

2
그가 그것을 얻은 곳 은 표준 인코딩 을 참조하십시오 ( "코덱" 까지 아래로 스크롤 ). 또한 사용 가능 : s.encode('rot13'),s.encode( 'base64' )
bobobobo

8
이 방법은 gzip에 헤더와 체크섬이 포함되어 있다는 점에서 gzip 명령 줄 유틸리티와 호환되지 않지만이 메커니즘은 단순히 콘텐츠를 압축합니다.
tylerl

:이 오래 그러나 당신이해야 압축 해제에 대한 코드의 줄 알고 plain_string_again = compressed_value.decode("zlib")
minillinim

6
@BenjaminToueg : Python 3은 유니 코드 문자열 ( strPython 3의 유형 )과 바이트 문자열 (유형 bytes) 의 구분에 대해 더 엄격합니다 . str객체는이 encode()반환 방법 bytes개체를 bytes객체는이 decode()방법이 리턴를 str. zlib그것으로 변환한다는 점에서 코덱은 특별한 bytesbytes가이 구조에 맞지 않는, 그래서. 당신은 사용할 수 있습니다 codecs.encode(b, "zlib")codecs.decode(b, "slib")A의 bytes객체 b대신.
Sven Marnach 2014

22

Sven Marnach의 2011 답변 Python3 버전 :

import gzip
exampleString = 'abcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijmortenpunnerudengelstadrocksklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuv123'
compressed_value = gzip.compress(bytes(exampleString,'utf-8'))
plain_string_again  = gzip.decompress(compressed_value)

2
Python 3 zlib에서는 여전히 사용되며 gzip실제로를 사용합니다 zlib. docs.python.org/3/library/zlib.htmldocs.python.org/3/library/gzip.html#module-gzip
gitaarik

내 원래 대답은 zlib를 사용했습니다. 원래 질문이기 때문에 gzip으로 변경되었습니다. 내 예제에서 gzip에서 zlib (검색 및 바꾸기)로 쉽게 바꿀 수 있으며 작동합니다.
Punnerud

2

Pandas 데이터 프레임을 JSON 형식으로 압축하려는 경우 :

Python 3.6 및 Pandas 0.23으로 테스트 됨

import sys
import zlib, lzma, bz2
import math

def convert_size(size_bytes):
    if size_bytes == 0:
        return "0B"
    size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
    i = int(math.floor(math.log(size_bytes, 1024)))
    p = math.pow(1024, i)
    s = round(size_bytes / p, 2)
    return "%s %s" % (s, size_name[i])

dataframe = pd.read_csv('...') # your CSV file
dataframe_json = dataframe.to_json(orient='split')
data = dataframe_json.encode()
compressed_data = bz2.compress(data)
decompressed_data = bz2.decompress(compressed_data).decode()
dataframe_aux = pd.read_json(decompressed_data, orient='split')

#Original data size:  10982455 10.47 MB
#Encoded data size:  10982439 10.47 MB
#Compressed data size:  1276457 1.22 MB (lzma, slow), 2087131 1.99 MB (zlib, fast), 1410908 1.35 MB (bz2, fast)
#Decompressed data size:  10982455 10.47 MB
print('Original data size: ', sys.getsizeof(dataframe_json), convert_size(sys.getsizeof(dataframe_json)))
print('Encoded data size: ', sys.getsizeof(data), convert_size(sys.getsizeof(data)))
print('Compressed data size: ', sys.getsizeof(compressed_data), convert_size(sys.getsizeof(compressed_data)))
print('Decompressed data size: ', sys.getsizeof(decompressed_data), convert_size(sys.getsizeof(decompressed_data)))

print(dataframe.head())
print(dataframe_aux.head())

-4
s = "a long string of characters"

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

4
질문은 프로세스에서 디스크에 쓰지 않고 메모리에서 문자열을 압축하는 것에 관한 것이라고 생각합니다. 그렇지 않으면 귀하의 대답은 완전히 정확합니다.
에 AlFe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.