2011-12-14 42 views
63

Làm cách nào để gzip nén một chuỗi bằng Python?Làm cách nào để gzip nén một chuỗi bằng Python?

gzip.GzipFile tồn tại, nhưng đó là dành cho đối tượng tệp - điều gì về với các chuỗi đơn giản?

+7

kết quả đầu tiên cho 'python gzip' http://docs.python.org/library/gzip.html (có thể bạn chỉ thử một chút?) – KevinDTimm

+0

@KevinDTimm, docu đó chỉ đề cập đến 'StringIO' nhưng không thực sự giải thích làm thế nào để làm điều đó. Vì vậy, đặt câu hỏi ở đây là hoàn toàn hợp lệ, IMHO. Một số thử nghiệm trước khi hỏi và nói với chúng tôi về chúng sẽ tốt đẹp. – Alfe

+0

@Alfe - câu hỏi đã bị đóng 4 năm trước vì nhiều lý do giống như nhận xét của tôi - OP không cố gắng tìm kiếm đầu tiên. – KevinDTimm

Trả lời

2

Chọn mô-đun phù hợp từ http://docs.python.org/library/archiving.html - hoặc gzip hoặc zlib, tùy thuộc vào nhu cầu chính xác của bạn.

+1

Tôi thấy rằng zlib có nhiều mức độ nén. Mức độ mà gzip sử dụng là gì? – bellpeace

+2

bellpeace, bạn có theo liên kết đến tài liệu hướng dẫn cho gzip không? "Đối số nén là một số nguyên từ 1 đến 9 kiểm soát mức độ nén, 1 là nhanh nhất và tạo ra nén ít nhất, và 9 là chậm nhất và tạo nén nhất. Mặc định là [REDACTED]". Tôi sẽ cho phép bạn tự kiểm tra giá trị thực tế. :) –

+0

Giá trị mặc định là 9, chậm nhất. –

52

Cách đơn giản nhất là zlibencoding:

compressed_value = s.encode("zlib") 

Sau đó, bạn giải nén nó với:

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

là s chuỗi? – dcousens

+1

@Daniel: Vâng, 's' là một đối tượng Python 2.x thuộc loại' str'. –

+2

Xem [Mã hóa tiêu chuẩn] (http://docs.python.org/2/library/codecs.html#standard-encodings) cho nơi anh ta nhận được (di chuyển xuống __ "codec" __). Cũng có sẵn: 's.encode ('rot13')', 's.encode ('base64')' – bobobobo

123

Nếu bạn muốn tạo ra một hoàn gzip -tương thích chuỗi nhị phân, với tiêu đề vv, bạn có thể sử dụng gzip.GzipFile cùng với 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

Trình tiết kiệm cuộc sống. Tuyệt vời. Tôi biết đây là cũ, nhưng cảm ơn! –

+15

Đây phải là câu trả lời được chấp nhận. – ForeverWintr

+2

Đối diện của điều này là: 'def gunzip_text (văn bản): infile = StringIO.StringIO() infile.write (văn bản) với gzip.GzipFile (fileobj = infile, mode =" r ") là f: 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

Tôi đoán câu hỏi là về việc nén một chuỗi trong bộ nhớ mà không cần phải ghi nó vào đĩa trong tiến trình. Nếu không câu trả lời của bạn là hoàn toàn chính xác. – Alfe

Các vấn đề liên quan