how to write a line in a text file

Steven D'Aprano steve at REMOVETHIScyber.com.au
Mon Jul 25 19:27:40 EDT 2005


On Mon, 25 Jul 2005 20:51:42 +0100, Steve Holden wrote:

> In Python you can use a text file's readlines() method to build a list 
> of all the lines in a file. That makes it quite easy to change numbered 
> lines. Having modified the file's content in memory you can then create 
> a new file using the writelines() method of a new file. The trick is to 
> avoid losing both the old and the new files when a low-probability crash 
> occurs.

I'm usually opposed to creeping featuritis in programming languages ("it
would be really cool if Python had a built-in command to do my entire
application") but safe over-writing of files does cry out for a "batteries
included" approach:

- it is a common usage;
- it is tricky to get right;
- it is even trickier to get right in a platform independent way;
- and it is even trickier again to get right in a platform independent way
that doesn't introduce security risks.

The normal trick is to do something like:

read file A;
write temporary file B without clobbering any existing B;
rename file A to C;
rename B to A;
delete C when you know the writing and renaming has succeeded;
and do it all in such a way that it succeeds even if there is very little
available disk-space.

The platform-independence comes from the fact that different OSes expect
the temporary files to live in different places (eg /tmp/ under Linux).
Most operating systems consider it poor form to just write temporary files
any old place.

I'm told by those who claim to know what they're talking about that a
potential risk exists if an attacker can predict the temporary file name
and thus do nefarious things. The exact nature of those nefarious things
was not explained to me, but I do recall the occasional security advisory
for applications which use insufficiently-random temporary file names.

Does anyone have anything suitable for a "safe-overwrite" module?

-- 
Steven.




More information about the Python-list mailing list