Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing a BytesIO object to a file, 'efficiently'

Tags:

So a quick way to write a BytesIO object to a file would be to just use:

with open('myfile.ext', 'wb') as f:     f.write(myBytesIOObj.getvalue()) myBytesIOObj.close() 

However, if I wanted to iterate over the myBytesIOObj as opposed to writing it in one chunk, how would I go about it? I'm on Python 2.7.1. Also, if the BytesIO is huge, would it be a more efficient way of writing by iteration?

Thanks

like image 950
Kalabaaz Avatar asked Aug 20 '16 03:08

Kalabaaz


People also ask

Is BytesIO a file like object?

StringIO and BytesIO are methods that manipulate string and bytes data in memory. StringIO is used for string data and BytesIO is used for binary data. This classes create file like object that operate on string data. The StringIO and BytesIO classes are most useful in scenarios where you need to mimic a normal file.

What is the use of io BytesIO?

Python io module allows us to manage the file-related input and output operations. The advantage of using the IO module is that the classes and functions available allows us to extend the functionality to enable writing to the Unicode data.

How do you create a file like an object in Python?

To create a file object in Python use the built-in functions, such as open() and os. popen() . IOError exception is raised when a file object is misused, or file operation fails for an I/O-related reason. For example, when you try to write to a file when a file is opened in read-only mode.


1 Answers

shutil has a utility that will write the file efficiently. It copies in chunks, defaulting to 16K. Any multiple of 4K chunks should be a good cross platform number. I chose 131072 rather arbitrarily because really the file is written to the OS cache in RAM before going to disk and the chunk size isn't that big of a deal.

import shutil  myBytesIOObj.seek(0) with open('myfile.ext', 'wb') as f:     shutil.copyfileobj(myBytesIOObj, f, length=131072) 

BTW, there was no need to close the file object at the end. with defines a scope, and the file object is defined inside that scope. The file handle is therefore closed automatically on exit from the with block.

like image 200
tdelaney Avatar answered Oct 15 '22 20:10

tdelaney