[Tutor] re-reading file-like objects (SOLVED?)
Kent Johnson
kent37 at tds.net
Mon Oct 9 15:43:39 CEST 2006
Tiago Saboga wrote:
> But I strip the code, and post a new one. The solution I found is in the
> seek() method of the file object. And the problem I had is that not all the
> file-like objects have a functional seek() method. It's not the case for the
> object referenced by the stdout attribute of the subprocess.Popen class. So I
> have to copy it in a (seekable) temporary file. As I have already bothered
> you with my question, let's try to make it still useful: is it the "right"
> (or pythonic) way to do this?
>
> Thanks,
>
> Tiago.
>
> ============solution================
> import subprocess, shutil, tempfile
>
> FILESIZE = 200000
> NUMBER = 10
> DIR = '/tmp/pytest'
> FILENAME = 'treco.x'
>
> cmd = ['dd', 'if=/dev/zero', 'count=1', 'bs=%s' % FILESIZE]
> tempbasefile = tempfile.TemporaryFile()
>
> basefile = subprocess.Popen(
> cmd,
> stdout=subprocess.PIPE,
> bufsize=FILESIZE
> ).stdout
>
> shutil.copyfileobj(basefile, tempbasefile)
>
> for i in range(NUMBER):
> tempbasefile.seek(0)
> print "File number %s" % i
> newfile = open('%s/%s%s' % (DIR, FILENAME, i), 'w')
> shutil.copyfileobj(tempbasefile, newfile)
> newfile.close()
This is similar to your first successful solution in a way - you are
reading the contents of the input file and storing them in a temporary
location. In the first version you stored the contents in memory; in
this one you store the contents in a temp file. Unless the data is too
large to fit in memory I think the first program is preferable, it is
simpler and will likely be faster.
Kent
More information about the Tutor
mailing list