【问题标题】:Using absolute unix paths in windows with python在带有 python 的 windows 中使用绝对 unix 路径
【发布时间】:2012-10-21 04:08:25
【问题描述】:

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

所以我想要这样的东西:

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

并在 unix 中获取文件:

/var/lib/blob_files/myfile.blob

在窗口中:

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

它也可能与用户主文件夹(unix 中的 /home/user 和 windows 中的 C:/Users/User)有关,但我想问题非常相似。

我怎样才能做到这一点?是否有任何库或函数可以帮助我透明地转换此路径,而无需询问脚本一直在哪个平台上运行?

在我的两个选项中,从根目录绝对或从主文件夹相对,你推荐使用哪一个?

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

【问题讨论】:

  • 不是重复的。来吧伙计们,让新朋友休息一下。
  • 我不确定你为什么认为你需要一个绝对路径“因为我使用 git 并且不想处理排除所有这些文件”。那是怎么回事?无论如何,家庭相关似乎在这里更有意义,因为 Windows 用户不会有一个名为 C:\var\lib`, so creating C:\var\lib\blob_files 的目录会很奇怪,但创建 Windows 等效于 ~/.blob_files完全合理。

标签: python windows unix path cross-platform


【解决方案1】:

来自 Blenders 回复Platform-independent file paths?

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

【讨论】:

  • 这在 Windows 上对我不起作用(使用 Python 2.7)
【解决方案2】:

使用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

【讨论】:

  • 这里不需要abspath;你需要normpath。确实abspath 隐式调用normpath,但你应该调用正确的函数来完成这项工作,而不是偶然发生的工作。另外,这实际上是在C: 上还是在当前驱动器上? (哪一个适合 OP 使用?)
  • 我故意选择了abspath(),因为normpath() 不会将驱动器号添加到返回的路径中。这几乎不是意外。驱动器号将是 Python 脚本所在的当前目录中的驱动器号(我将相应地更新我的答案)。
  • 当输入是 Windows 路径并且您在 Linux 上运行时,不会“做正确的事情”(换句话说,它不会将正斜杠转换为反斜杠)
【解决方案3】:

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

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

也许对任何人都有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2012-06-30
    • 2022-11-16
    相关资源
    最近更新 更多