python - update file descriptor after os.rename() -



python - update file descriptor after os.rename() -

what best way handle bad file descriptor errors after calling os.rename() in next manner?

f = open('foo.txt', 'rw') os.rename(f.name, f.name + ".bak")

in file scheme there no longer foo.txt instead foo.txt.bak

however..

f.name

gives foo.txt instead of foo.txt.bak

but..

f.write("test")

gives bad file descriptor

is there way update file descriptor?

should still phone call f.close() tho file has been renamed?

you can write function rename open file. basically, close, rename, , reopen file, preserving attributes such file position , mode. tweaking of mode necessary reopen -- if file's mode "w", reopening same mode lose in it, utilize "r+" mode in case when reopening. (this isn't perfect, allows read access file, didn't have before, it's best can do.) of course of study new file descriptor, function's homecoming value.

import os def rename_open_file(fileobj, newname): name = fileobj.name mode = fileobj.mode.lower() posn = fileobj.tell() fileobj.close() os.rename(name, newname) newmode = mode if "w" in mode: # can't reopen "w" mode since newmode = "r+" # empty file; utilize "r+" if "b" in mode: newmode += "b" fileobj = open(name, newmode) fileobj.seek(posn) homecoming fileobj f = rename_open_file(f, f.name + ".bak")

if have more 1 file object referencing open file, isn't going help, of course; other references may break.

caveat: file's name attribute isn't total path, if opened file using relative path , have changed directory since opening file, isn't going work. can write own open() figures out file's total pathname @ open time (using os.path.abspath()) if problem.

also, buffer size given when opening file isn't preserved since not recorded anywhere on file object. writing own open() can resolve this, too. easiest way subclass file.

from os.path import abspath class open(file): def __init__(self, filename, mode="r", buffering=-1): file.__init__(self, abspath(filename), mode, buffering) self.buffering = buffering

then can add together maintaining buffering function:

import os def rename_open_file(fileobj, newname): name = fileobj.name mode = fileobj.mode.lower() posn = fileobj.tell() buff = fileobj.buffering fileobj.close() os.rename(name, newname) newmode = mode if "w" in mode: # can't reopen "w" mode since newmode = "r+" # empty file; utilize "r+" if "b" in mode: newmode += "b" fileobj = open(name, newmode, buff) fileobj.seek(posn) homecoming fileobj

python

Comments

Popular posts from this blog

iphone - Dismissing a UIAlertView -

intellij idea - Update external libraries with intelij and java -

javascript - send data from a new window to previous window in php -