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

jer*_*uki 25 python unix windows cross-platform path

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

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

path = '/var/lib/blob_files/'
file = open(path+'myfile.blob', 'w')
Run Code Online (Sandbox Code Playgroud)

并在unix中获取一个文件:

/var/lib/blob_files/myfile.blob
Run Code Online (Sandbox Code Playgroud)

在窗口:

C:\var\lib\blob_files\myfile.blob
Run Code Online (Sandbox Code Playgroud)

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

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

在我的两个选项中,绝对从root或相对于home文件夹,你建议使用哪一个?

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

kin*_*all 33

使用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
Run Code Online (Sandbox Code Playgroud)

这些将为Windows和POSIX路径"做正确的事".

expanduser()如果路径中没有路径,则不会更改路径~,因此您可以安全地将其用于所有路径.因此,您可以轻松编写包装函数:

import os
def fixpath(path):
    return os.path.abspath(os.path.expanduser(path))
Run Code Online (Sandbox Code Playgroud)

请注意,使用的将是由Python进程的当前工作目录,指定的驱动器盘符,通常的目录你的脚本是(如果从Windows资源管理器启动,并假设你的脚本不改变的话).如果你想强制它永远是C:你可以做这样的事情:

import os
def fixpath(path):
    path = os.path.normpath(os.path.expanduser(path))
    if path.startswith("\\"): return "C:" + path
    return path
Run Code Online (Sandbox Code Playgroud)

  • 你这里不需要`abspath`; 你需要`normpath`.确实`abspath`隐含地调用了'normpath`,但是你应该为这个工作调用正确的函数,而不是偶然发生的函数.此外,这实际上是在`C:`,还是在当前的驱动器上?(哪一个适合OP使用?) (3认同)