Writing then reading in-memory bytes (BytesIO) gives a blank result

48,413

Solution 1

You need to seek back to the beginning of the file after writing the initial in memory file...

myio.seek(0)

Solution 2

How about we write and read gzip content in the same context like this?

#!/usr/bin/env python

from io import BytesIO
import gzip

content = b"does it work"

# write bytes to zip file in memory
gzipped_content = None
with BytesIO() as myio:
    with gzip.GzipFile(fileobj=myio, mode='wb') as g:
        g.write(content)
    gzipped_content = myio.getvalue()

print(gzipped_content)
print(content == gzip.decompress(gzipped_content))
Share:
48,413
twasbrillig
Author by

twasbrillig

DevOps Engineer at a website in San Francisco.

Updated on July 08, 2022

Comments

  • twasbrillig
    twasbrillig almost 2 years

    I wanted to try out the python BytesIO class.

    As an experiment I tried writing to a zip file in memory, and then reading the bytes back out of that zip file. So instead of passing in a file-object to gzip, I pass in a BytesIO object. Here is the entire script:

    from io import BytesIO
    import gzip
    
    # write bytes to zip file in memory
    myio = BytesIO()
    with gzip.GzipFile(fileobj=myio, mode='wb') as g:
        g.write(b"does it work")
    
    # read bytes from zip file in memory
    with gzip.GzipFile(fileobj=myio, mode='rb') as g:
        result = g.read()
    
    print(result)
    

    But it is returning an empty bytes object for result. This happens in both Python 2.7 and 3.4. What am I missing?

  • TomTom101
    TomTom101 over 7 years
    Buffers filled by matplotlib savefig() also do need this before they can be sent by an application server. Thanks for ending hours of research!
  • dz902
    dz902 almost 4 years
    Or use getvalue(). These little things are scattered all over the place!
  • caot
    caot over 3 years
    getvalue() didn't work for me except the seek(0)
  • juan
    juan about 3 years
    I don't think g.close() is needed here, right?
  • Gatsby Lee
    Gatsby Lee about 3 years
    @juan you're right. since it is in context, g.close() is not necessary. I removed it. Thank you.