fo.flush() & fo.write() on windows

Roberts, Robert J robert_j_roberts at rl.gov
Mon Aug 30 03:27:46 CEST 1999


Tim Peters wrote:

> [Roberts, Robert J]
> > Am I asking too much?
>
> On Windows, yes.  C's stdio isn't its native file-handling system, and its
> implementation of stdio is, umm, "surprising".
>
> > pseudo code:
>
> >     fo = __builtin__.open(foName, 'a')
>
> Why not plain "open"?

Because __builtin__.open() works? I started doing file opens by copying some of
Guido's code. It worked. I never tried open() alone.

>
>
> >     foSize = os.stat(foName)[6]     # if foSize = 100...
>
> os.path.getsize(foName) is easier on the brain (new in 1.5.2 though).

Thanks. Didn't know it was an option.

>
>
> >     fo.write('Some string.')             # fo.write() returns None
>
> file.write() always returns None, as documented.  Don't know what you expected
> it to return, but read the docs.

I must have been reading the wrong place in the documentation all this time. I was
reading doc/lib/node105.html which says:

"write(fd,str)  Write the string str to file descriptor fd. Return the number of
bytes actually written."

>
>
> >     foSize = os.stat(foName)[6]    # ...foSize STILL = 100.
>
> Unsurprising so far.
>
> >     fo.flush()
> >     foSize = os.stat(foName)[6]    # ...foSize STILL = 100.
>
> Ah -- *that's* Windows <wink>!
>
> >     fo.close()                     # 'Some string' appears in fo.
> >     foSize = os.stat(foName)[6]    # [now the bytes appear]
> >
> > I am running Python 1.5.2 on Windows 95. fo.write() appears to be
> > buffering the write and returning None for bytes written on
> > fo.write().
>
> "None" is expected (see above).  Buffering should be expected too since you
> opened the file with buffering.  If you don't want buffering, pass 0 as the
> third arg:
>
>      fo = open(foName, 'a', 0)

Didn't know this was an option. I'll give it a try and see what it does. But (as
you say), it probably won't do much if Windows is still buffering.

>
>
> Alas, on Windows that won't make much of a difference in what you see.
>
> > fo.flush() appears to do nothing.
>
> MS's implementation of stdio's fflush (which Python's file.flush() calls
> directly) does clear the stdio buffers, but merely flushes them to Windows'
> internal buffers.  It does not imply commitment to disk.  The only way to get
> that under Windows is to pass the non-standard "c" (for Commit) mode flag to
> "open":
>
>     fo = open(foName, 'ac')

I'll look into this too, but I don't want to slow the code down anymore if I can
help it. I'll compare it with closing and reopening the file (which DOES dump the
buffer immediately) just to see what happens.

>
>
> Then fo.write(whatever) *still* won't (necessarily) show up on disk right away,
> but fo.flush() will work the way you expect.  "c" is unportable, and much as
> you may think you want it now <wink>, slows down Windows output enormously.
>
> windows-was-designed-under-the-assumption-that-it-would-
>     never-crash<snort>-ly y'rs  - tim

Thanks, millions!





More information about the Python-list mailing list