Copying data between file-like objects

Fredrik Lundh fredrik at pythonware.com
Wed Feb 16 03:15:56 EST 2005


Thomas Lotze wrote:

>> if you don't know how large f2 can be, use shutil.copyfileobj:
>>
>>     >>> help(shutil.copyfileobj)
>>     Help on function copyfileobj in module shutil:
>>
>>     copyfileobj(fsrc, fdst, length=16384)
>>         copy data from file-like object fsrc to file-like object fdst
>
> This sounds like what I was looking for. Thanks for the pointer.
> However, the following doesn't seem like anything is being copied:
>
>>>> from StringIO import StringIO
>>>> from shutil import copyfileobj
>>>> s = StringIO()
>>>> s2 = StringIO()
>>>> s.write('asdf')
>>>> copyfileobj(s, s2)
>>>> s2.getvalue()

copyfileobj copies from the current location, and write leaves the file
pointer at the end of the file.  a s.seek(0) before the copy fixes that.

>> to copy stringio objects, you can use f1 = StringIO(f2.getvalue()).
>
> But this should have the same problem as using read(): a string will be
> created on the way which contains all the content.

getvalue() returns the contents of the f2 file as a string, and f1 will use that
string as the buffer.  there's no extra copying.

> Because I want to manipulate a copy of the data and be able to compare it
> to the original afterwards.

why not just use a plain string (or a list of strings)?  your focus on StringIO sounds
like a leftover from some C library you've been using in an earlier life ;-)

> Another thing I'd like to do is copy parts of a StringIO object's content
> to another object. This doesn't seem possible with any shutil method. Any
> idea on that?

use a plain string and slicing.  (if you insist on using StringIO, use seek and read)

> What one can really wonder, I admit, is why the difference between holding
> data two or three times in memory matters that much, especially if the
> latter is only for a short time. But as I'm going to use the code that
> handles the long string as a core component to some application, I'd like
> to make it behave as well as possible.

use plain strings, so you know what you're doing.

</F> 






More information about the Python-list mailing list