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))
![twasbrillig](https://i.stack.imgur.com/TPTow.png?s=256&g=1)
Comments
-
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 aBytesIO
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 forresult
. This happens in both Python 2.7 and 3.4. What am I missing? -
TomTom101 over 7 yearsBuffers filled by matplotlib savefig() also do need this before they can be sent by an application server. Thanks for ending hours of research!
-
dz902 almost 4 yearsOr use
getvalue()
. These little things are scattered all over the place! -
caot over 3 yearsgetvalue() didn't work for me except the seek(0)
-
juan about 3 yearsI don't think
g.close()
is needed here, right? -
Gatsby Lee about 3 years@juan you're right. since it is in context, g.close() is not necessary. I removed it. Thank you.