文件对象的绝对路径

时间:2010-03-16 22:41:23

标签: python file filesystems

之前已经在StackOverflow上讨论了这个问题 - 我试图找到一个很好的方法来找到文件对象的绝对路径,但我需要它对os.chdir()具有鲁棒性,所以不能使用

f = file('test')
os.path.abspath(f.name)

相反,我想知道以下是否是一个很好的解决方案 - 基本上扩展文件类,以便在打开时,保存文件的绝对路径:

class File(file):

    def __init__(self, filename, *args, **kwargs):
        self.abspath = os.path.abspath(filename)
        file.__init__(self, filename, *args, **kwargs)

然后就可以做到

f = File('test','rb')
os.chdir('some_directory')
f.abspath # absolute path can be accessed like this

这样做有风险吗?

2 个答案:

答案 0 :(得分:14)

一个重要的风险是,一旦文件打开,进程就会通过文件描述符处理该文件,其路径。在许多操作系统上,文件的路径可以被其他进程改变(通过不相关进程中的mv操作,比如说)并且文件描述符仍然有效并且引用相同的文件。

我经常利用这一点,例如,开始下载一个大文件,然后意识到目标文件不是我想要的地方,并跳到一个单独的shell并将其移动到正确的位置 - 下载继续不间断。

因此,当操作系统没有提供此类保证时,依赖于过程生命周期中保持相同的路径是一个坏主意。

答案 1 :(得分:1)

这取决于你需要它。

只要您了解这些限制 - 有人可能会在此期间移动,重命名或硬链接文件 - 这有很多适当的用途。您可能希望在完成文件时删除文件,或者在编写文件时出现问题(例如,gcc在编写文件时执行此操作):

f = File(path, "w+")
try:
    ...
except:
    try:
        os.unlink(f.abspath)
    except OSError: # nothing we can do if this fails
        pass
    raise

如果您只想在用户消息中识别文件,那么就已经有了file.name。不幸的是,不可能将其(可靠地)用于其他任何事情;例如,没有办法区分文件名“<stdin>”和sys.stdin。

(你真的不应该从内置类派生只是为了向它添加属性;这只是一个丑陋的不一致的Python怪癖......)