在窗口中使用python的绝对unix路径

时间:2012-10-31 16:19:01

标签: python windows unix path cross-platform

我正在创建一个将blob文件存储到硬盘中的应用程序,但是这个脚本必须在linux和windows中运行,问题是我想从文件系统根目录给它一个绝对路径,而不是一个相对于项目文件,这是因为我使用git而不想处理从同步中排除所有这些文件。

所以我希望有这样的东西:

path = '/var/lib/blob_files/'
file = open(path+'myfile.blob', 'w')

并在unix中获取一个文件:

/var/lib/blob_files/myfile.blob

并在Windows中:

C:\var\lib\blob_files\myfile.blob

它也可能是相对于用户主文件夹(/ home中的/ home / user和Windows中的C:/ Users / User)但我猜问题非常相似。

我怎样才能做到这一点?是否有任何库或函数可以帮助我透明地转换这些路径,而不必询问脚本一直在运行什么plataform?

在我的两个选项中,绝对来自root或相对于home文件夹,你推荐使用哪一个?

提前感谢您对此提出的任何建议

3 个答案:

答案 0 :(得分:31)

使用os.path.abspath()os.path.expanduser()获取与用户主目录相关的文件:

print os.path.abspath("/var/lib/blob_files/myfile.blob")
>>> C:\var\lib\blob_files\myfile.blob

print os.path.abspath(os.path.expanduser("~/blob_files/myfile.blob"))
>>> C:\Users\jerry\blob_files\myfile.blob

这些将为Windows和POSIX路径“做正确的事”。

如果路径中没有expanduser()

~将不会更改路径,因此您可以安全地将其用于所有路径。因此,您可以轻松编写包装函数:

import os
def fixpath(path):
    return os.path.abspath(os.path.expanduser(path))

请注意,使用的驱动器号将是Python进程的当前工作目录指定的驱动器,通常是脚本所在的目录(如果从Windows资源管理器启动,并假设您的脚本不更改它)。如果你想强迫它永远是C:,你可以这样做:

import os
def fixpath(path):
    path = os.path.normpath(os.path.expanduser(path))
    if path.startswith("\\"): return "C:" + path
    return path

答案 1 :(得分:2)

好的,我自己得到了答案。

os.path.exists(os.path.abspath(filePath))

也许这对任何人都有用

答案 2 :(得分:1)

来自Blenders在Platform-independent file paths?

的回复
>>> import os
>>> os.path.join('app', 'subdir', 'dir', 'filename.foo')
'app/subdir/dir/filename.foo'