On Aug 25, 5:37 am, Tim Chase <python.l...@tim.thechases.com> wrote: > > I want the file pointer set to 100 and overwrite everything from there > [snip] > > def application(environ, response): > > query=os.path.join(os.path.dirname(__file__),'teeeeeeeeeemp') > > range=environ.get('HTTP_RANGE','bytes=0-').replace > > ('bytes=','').split(',') > > offset=[] > > for r in range: offset.append(r.split('-')) > > with open(query,'w+') as f: > > f.seek(int(offset[0][0])) > > while True: > > chunk=environ['wsgi.input'].read(8192).decode('latin1') > > if not chunk: break > > f.write(chunk) > > f=open(query) > > l=str(os.fstat(f.fileno()).st_size) > > response('200 OK', [('Content-Type', 'text/plain'), ('Content- > > Length', str(len(l)))]) > > return [l] > > A couple items of note: > > - you don't open the file in binary mode -- seek is more reliable > in binary mode :)
If my memory is right, if file is opened in binary mode, also wouldn't need to be decoding the WSGI input stream as latin-1 to get a string. Instead can just deal with bytes and write bytes to file. Graham > - if you want to lop off the rest of the file, use f.truncate() > > An example: > > # create the initial file > >>> f = file('zzz.zzz', 'wb+') > >>> f.write('abcdefghijklmnop') > >>> f.close() > > >>> f = file('zzz.zzz', 'ab+') > >>> f.read() # show the existing content > 'abcdefghijklmnop' > >>> f.seek(5) # seek to the desired offset > >>> f.truncate() # throw away everything after here > >>> f.write('zyx') # write the new data at pos=5 > >>> f.close() > > # demonstrate that it worked > >>> f = file('zzz.zzz', 'rb') > >>> f.read() > 'abcdezyx' > >>> f.close() > > > also why must I open the file a second time to know how big it is ? > > Likely the output has been buffered. You can try using > > f.flush() # write all the data to the disk first > size = os.fstat(f.fileno()).st_size > > which seems to do the trick for me. > > -tkc -- http://mail.python.org/mailman/listinfo/python-list