मैं पायजॉन में एक स्ट्रिंग को कैसे संकुचित कर सकता हूं?


87

मैं पायजॉन में एक स्ट्रिंग को कैसे संकुचित कर सकता हूं?

gzip.GzipFile मौजूद है, लेकिन यह फ़ाइल ऑब्जेक्ट्स के लिए है - सादे तार के बारे में क्या?


1
@KevinDTimm, कि केवल उल्लेख StringIOकरता है लेकिन वास्तव में यह कैसे करना है की व्याख्या नहीं करता है। इसलिए यह सवाल पूछना पूरी तरह से वैध है, IMHO। हमारे बारे में पूछने और बताने से पहले कुछ और परीक्षण अच्छे रहे होंगे, हालाँकि।
एल्फ

@Alfe - यह प्रश्न 4 साल पहले मेरी टिप्पणी के समान कारण के लिए बंद कर दिया गया था - ओपी ने पहले खोज करने के लिए कोई प्रयास नहीं किया।
केविनडिटिम

4
यह ऑफ-टॉपिक कैसा है?

2
यह प्रश्न Google के लिए अब शीर्ष हिट है gzip string in pythonऔर बहुत ही उचित IMO है। इसे फिर से खोला जाना चाहिए।
गैरेट

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 (पाठ): infile = StringIO.Stringio () infile.write (पाठ) gzip.GzipFile (fileobj = infile, mode =" r ") के रूप में f: f.rewind () f .read () out.getvalue ()
fastmultiplication

3
@fastmultiplication: या इससे कम:f = gzip.GzipFile(StringIO.StringIO(text)); result = f.read(); f.close(); return result
अल्फ

2
दुर्भाग्य से, प्रश्न करीब हो गया है, इसलिए मैं एक नया उत्तर नहीं दे सकता, लेकिन यहां बताया गया है कि पायथन 3 में यह कैसे करना है
गैरेट

संभवतः असंबंधित, पहले मेमोरी में तेजी से (स्थानीय डिस्क का उपयोग करके) संपीड़ित कर रहा है?
user3226167

1
पायथन 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;
ओस्ट्रोकैच

64

सबसे आसान तरीका zlib एन्कोडिंग है :

compressed_value = s.encode("zlib")

तो आप इसे के साथ decompress:

plain_string_again = compressed_value.decode("zlib")

1
@ डैनियल: हाँ, sएक पायथन 2.x प्रकार की वस्तु है str
स्वेन मार्नाच

2
जहां वह मिला उसके लिए मानक एन्कोडिंग देखें (स्क्रॉल करके "कोडेक्स" पर जाएं )। इसके अलावा उपलब्ध: s.encode('rot13'),s.encode( 'base64' )
bobobobo

8
ध्यान दें कि यह विधि उस gzip में gzip कमांड-लाइन उपयोगिता के साथ असंगत है जिसमें हेडर और चेकसम शामिल हैं, जबकि यह तंत्र केवल सामग्री को संपीड़ित करता है।
tylerl

मुझे पता है कि यह पुराना है, लेकिन आपको plain_string_again = compressed_value.decode("zlib")
डिकम्प्रेसिंग

6
@BenjaminToueg: पायथन 3 यूनिकोड स्ट्रिंग्स ( strपायथन 3 में टाइप ) और बाइट स्ट्रिंग्स (प्रकार bytes) के बीच अंतर के बारे में स्पष्ट है । strऑब्जेक्ट्स में एक encode()विधि होती है जो bytesऑब्जेक्ट लौटाती है , और bytesऑब्जेक्ट्स में एक decode()विधि होती है जो एक रिटर्न देती है strzlibमें है कि यह से धर्मान्तरित कोडेक खास है bytesकरने के लिए bytes, तो यह इस संरचना में फिट नहीं करता है। आप उपयोग कर सकते हैं codecs.encode(b, "zlib")और codecs.decode(b, "slib")एक के लिए bytesवस्तु bके बजाय।
स्वेन मार्नाच

22

स्वेन मार्नाच के 2011 के जवाब का पायथन 3 संस्करण:

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

2
पायथन 3 zlibमें अभी भी उपयोग किया जाता है, gzipवास्तव में उपयोग करता है zlib, देखें: docs.python.org/3/library/zlib.html और docs.python.org/3/library/gzip.html#module-gzip
gitaarik

मेरा मूल उत्तर zlib का उपयोग कर रहा था। Gzip में बदल गया क्योंकि यह मूल प्रश्न था। आप मेरे उदाहरण में आसानी से gzip से zlib (खोज-और-जगह) बदल सकते हैं, और यह काम करेगा।
पुनर्न्यूड

2

जो लोग JSON प्रारूप में एक पंडों डेटाफ्रेम को संपीड़ित करना चाहते हैं:

पायथन 3.6 और पंडों के साथ परीक्षण 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
मुझे लगता है कि सवाल यह है कि इस प्रक्रिया में डिस्क पर लिखने के बिना मेमोरी में एक स्ट्रिंग को संपीड़ित करने के बारे में था। अन्यथा आपका उत्तर पूरी तरह से सही है।
एल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.