I need to update a file. I read it in and write it out with changes. However, I’d prefer to write to a temporary file and rename it into place.
temp = tempfile.NamedTemporaryFile()
tempname = temp.name
temp.write(new_data)
temp.close()
os.rename(tempname, data_file_name)
The problem is that tempfile.NamedTemporaryFile() makes the temporary file in /tmp which is a different file system. This means os.rename() fails. If I use shlib.move() instead then I don’t have the atomic update that mv provides (for files in the same file system, yadda, yadda, etc.)
I know tempfile.NamedTemporaryFile() takes a dir parameter, but data_file_name might be "foo.txt" in which case dir='.'; or data_file_name might be "/path/to/the/data/foo.txt" in which case dir="/path/to/the/data".
What I’d really like is the temp file to be data_file_name + "some random data". This would have the benefit of failing in a way that would leave behind useful clues.
Suggestions?
You can use:
prefixto make the temporary file begin with the same name as theoriginal file.
dirto specify where to place the temporary file.os.path.splitto split the directory from the filename.