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
Post a Comment