confusion about opening files

Alex Martelli aleax at aleax.it
Tue Sep 24 03:40:05 EDT 2002


Arief wrote:

[ I'm putting last things first here...:-) ]
> I hope it would help you. Any correction is welcomed ...

No corrections -- just a few extra tidbits...

> The os.open is os syscall (system call). It is used to open file, fifo,
> device, etc in UNIX or Linux environment (I don't know about MS Windows).

On Windows, Visual C++'s runtime libraries simulate the Unix/Linux/BSD
system calls open / read / write / etc to some extent, basically to
ease porting programs originally written for Unix &c.


> The built in function: "open" uses c function "fopen". It is a buffered
> version of os syscall "open" implementation. You should use appropriate

You can, if you wish, open a file in unbuffered mode, too.

> function for further operation too, for example:
> 
> fname = '/tmp/a.txt'
> f = open(fname, 'w')

f = open(fname, 'w', 0)

gives you an unbuffered file object f.

> It is "not guaranteed" that as soon as you complete the f.write call, the
> file is written with data you've feed. Because it is a buffered operation.
> So to assure the OS to write your text immediately, you should do this:
> 
> fname = '/tmp/a.txt'
> f = open(fname, 'w')
> f.write('this is only example\n')
> f.flush()             # flush buffered data for previous write operation
> f.close()

No need to flush right before closing, ever -- close flushes all that
needs to be flushed.

No need to flush if you open the file in unbuffered mode.  With unbuffered
files, or frequent flushing, I/O performance may degrade.

Flush, and unbuffered files, ASK the OS to please, please write the
data out -- but not all OS's comply.  A traditional problem with DOS
and related systems (I'm pretty sure it still was in Windows/98) is
that the OS _doesn't_ comply with your kind request: if your program
crashes without closing files, the files may end up empty even though
you wrote and flushed repeatedly.  The only "cure" (HA!) to this
horrid situation was to *CLOSE AND REOPEN FOR APPEND* such files
periodically (talk about performance being degraded...!!!).  I hope
(but don't know for a fact) that there are no such horrid issues
with current OS'es such as Win/XP.


Alex




More information about the Python-list mailing list