to get name of file opened
Hi Is there any way to get the name of the file opened from the file object 'f' which i get through the code f = os.fdopen(os.open(trial', os.O_WRONLY|os.O_CREAT), w) The situation will be like i can access only the above variable 'f'. f.name is having 'fdopen' instead of filename 'trial' Or if not possible can anyone suggest a solution where my requirements are a) i need file access through os module b) i need file object and not file descriptor as its more easy to use -- Thanks Regards visco -- http://mail.python.org/mailman/listinfo/python-list
Re: to get name of file opened
First question is why you need os.open(), and not the open() function. I'll guess that you need some of the access modes (e.g. for file sharing) that you get from the low level functions. So assuming that: I don't believe there's any way to use a fd (file descriptor) to retrieve the file name that was perhaps passed to open. There are ways to spelunk inside Windows, but they're not advisable. And I don't know what Unix might offer there. So by the time fdopen() is invoked, the name is already gone. Here's what I'd do. Create your own open function that has the parameters of os.open(), but that will return an object derived from the file object. Your derived object can have its own filename, but close() will know what to do. Alternatively, you could encapsulate the line you showed, and just zap the name attribute of the existing file object.right when it's being returned by fdopen() Visco Shaun wrote: Hi Is there any way to get the name of the file opened from the file object 'f' which i get through the code f = os.fdopen(os.open(trial', os.O_WRONLY|os.O_CREAT), w) The situation will be like i can access only the above variable 'f'. f.name is having 'fdopen' instead of filename 'trial' Or if not possible can anyone suggest a solution where my requirements are a) i need file access through os module b) i need file object and not file descriptor as its more easy to use -- http://mail.python.org/mailman/listinfo/python-list
Re: to get name of file opened
First of all Thanks Dave for the reply On Sat, 2009-03-28 at 09:51 -0500, Dave Angel wrote: First question is why you need os.open(), and not the open() function. I'll guess that you need some of the access modes (e.g. for file sharing) that you get from the low level functions. So assuming that: of course access was an issue.. but i opted for it because in the document it is mentioned that os.open(besides sharing b/w processes) is low level resembling unix system call, and i thought may be efficiency is more, even though interpreted by the same python interpreter... But i never found any article regarding any efficiency difference between those.. Can u comment on this I don't believe there's any way to use a fd (file descriptor) to retrieve the file name that was perhaps passed to open. There are ways to spelunk inside Windows, but they're not advisable. And I don't know what Unix might offer there. So by the time fdopen() is invoked, the name is already gone. Here's what I'd do. Create your own open function that has the parameters of os.open(), but that will return an object derived from the file object. Your derived object can have its own filename, but close() will know what to do. Well this is what i am trying now, though i wished if there was any suitable method or attribute built within python Alternatively, you could encapsulate the line you showed, and just zap the name attribute of the existing file object.right when it's being returned by fdopen() The name attribute appears to be read only as i tried that already though through the interpreter rather than in code -- http://mail.python.org/mailman/listinfo/python-list
Re: to get name of file opened
I doubt if there'd be any efficiency difference between the two approaches. You'll see a much bigger difference by switching from 't' to 'b'. Both the functions are native code in Python 2.6. I withdraw my two previous suggestions. As you said, the 'name' attribute is read-only (and documented as such). And there doesn't seem to be any documented constructor for a file object to make deriving from it feasible. So while there's undoubtedly a 'magic' way to do it, I would no longer suggest it. If you need the low level call, or if you measure some performance difference for your application, then here's what I'd suggest for the problem. Create a class with a dictionary to hold those names, keyed by an Open class object, and each time you call os.open(), add to the list. Then create a method/function called getfilename() that looks up the name for a given file object. If the file object was created by builtin-open(), just return the name attrribute. But if the name is fdopen then consult your dictionary. The catch to this approach is that you will be hanging onto these objects, so they won't be garbage collected unless you remove it from this list when you close. I've heard of something called weak-references, but have no experience with them. It could solve the gc problem. Otherwise, you could create what Python docs call a file like object. That's a class with all (or carefully chosen subset of) the methods and behavior of a builtin file object, but with additional methods (and perhaps a constructor) that solve your needs. You wouldn't do this for efficiency, but might for flexibility of modes. Visco Shaun wrote: First of all Thanks Dave for the reply On Sat, 2009-03-28 at 09:51 -0500, Dave Angel wrote: First question is why you need os.open(), and not the open() function. I'll guess that you need some of the access modes (e.g. for file sharing) that you get from the low level functions. So assuming that: of course access was an issue.. but i opted for it because in the document it is mentioned that os.open(besides sharing b/w processes) is low level resembling unix system call, and i thought may be efficiency is more, even though interpreted by the same python interpreter... But i never found any article regarding any efficiency difference between those.. Can u comment on this I don't believe there's any way to use a fd (file descriptor) to retrieve the file name that was perhaps passed to open. There are ways to spelunk inside Windows, but they're not advisable. And I don't know what Unix might offer there. So by the time fdopen() is invoked, the name is already gone. Here's what I'd do. Create your own open function that has the parameters of os.open(), but that will return an object derived from the file object. Your derived object can have its own filename, but close() will know what to do. Well this is what i am trying now, though i wished if there was any suitable method or attribute built within python Alternatively, you could encapsulate the line you showed, and just zap the name attribute of the existing file object.right when it's being returned by fdopen() The name attribute appears to be read only as i tried that already though through the interpreter rather than in code -- http://mail.python.org/mailman/listinfo/python-list