【问题标题】:Why not os.path.join use os.path.sep or os.sep?为什么 os.path.join 不使用 os.path.sep 或 os.sep?
【发布时间】:2012-08-23 06:50:35
【问题描述】:

众所周知,Windows 接受"\""/" 作为分隔符。 但是在 python 中,使用了"\"。例如调用os.path.join("foo","bar"),将返回'foo\\bar'。烦人的是有一个转义字符,所以你不能只复制路径字符串并粘贴到你的资源管理器位置栏。

我想知道有没有办法让python使用"/"作为默认分隔符,我尝试将os.path.sep和os.sep的值更改为"/",但os.path.join仍然使用@987654329 @。

什么是正确的方法?

PS:

我只是不明白为什么python在windows上使用“\”作为默认分隔符,也许旧版本的windows不支持“/”?

【问题讨论】:

  • os.path.sep 应该用于连接 filenamesdirectory 名称...谁说 os.path.sep 必须是用于网址????
  • 如果你不关心最后正确的路径分隔符,为什么要使用os.path.join
  • 你可以创建自己的函数,如果在 Windows 上使用 '/',或者在其他平台上使用 os.path.join。或者您可以在显示之前将路径中的 '\\' 替换为 '/'(或 '\')。
  • @BigYellowCactus 因为我的程序可能在其他系统上运行,但是我只想在windows上更改分隔符。
  • @ThemeZ 除了windows,还有其他系统使用反斜杠作为路径分隔符吗?

标签: python path


【解决方案1】:

要尽可能简单地回答您的问题,只需使用 posixpath 而不是 os.path。

所以而不是:

from os.path import join
join('foo', 'bar')
# will give you either 'foo/bar' or 'foo\\bar' depending on your OS

用途:

from posixpath import join
join('foo', 'bar')
# will always give you 'foo/bar'

【讨论】:

    【解决方案2】:

    这完全是关于 Python 如何检测你的操作系统:

    # in os.py
    if 'posix' in _names:
        ...
        import posixpath as path   
    
    elif 'nt' in _names:
        ...
        import ntpath as path
    

    因此,在 Windows 上会加载 ntpath 模块。如果您检查ntpath.pyposixpath.py 模块,您会注意到ntpath.join() 有点复杂,这也是因为您提到的原因:Windows 将/ 理解为路径分隔符。

    底线:虽然你可以在 Windows 中使用posixpath.join()(只要参数是POSIX 格式),但我不建议这样做。

    【讨论】:

      【解决方案3】:

      为什么不定义自定义显示函数?

      例如

      def display_path(path):
          return path.replace("\\", "/")
      

      如果你想用str.join 替换os.path.join,你可以这样做(str.join 需要一个列表,os.path.join 需要*args):

      join = lambda *args: "/".join(args)
      

      也许更好的办法是让 Python 规范化所有内容,然后替换,例如:

      join = lambda *args: os.path.join(*args).replace("\\", "/")
      

      当文件路径中有空格时,上面的唯一问题可能是在 posix 上。

      然后,您可以在 utils 文件的顶部放置 if 语句,并将 display_pathjoin 分别定义为 no-op 和 os.path.join(如果不在 Windows 上)。

      【讨论】:

        【解决方案4】:

        我不建议这样做。

        请注意,虽然 Windows 也接受斜线 / 作为路径分隔符,但它在某些情况下具有不同的含义。

        使用cd将其视为相对路径,例如:

        命令行:

        c:\Users\YourUser> cd /FooBar
        c:\FooBar

        这里,/ 替换驱动器号。


        另外,我看不出复制字符串有什么问题,因为如果你print 字符串,字符串会如你所愿地显示:

        Python 解释器:

        >>> 导入操作系统
        >>> 打印 os.path.join("c:\", "foo","bar")
        c:\foo\bar
        >>>


        【讨论】:

        • "/" 也是 linux 上的根文件夹,所以这不是问题。而且你说得对,打印的时候没问题,但是调试的时候让我很不爽。
        • 那么这究竟是何时何地出现的问题?您使用哪个 IDE?
        • 我的意思是,在调试时,反斜杠在你的变量观察器中显示为“\\”对吗?而且路径太多我不想全部打印出来..
        • @ThemeZ 是的,但是您使用的是哪个 IDE?蚀?翅膀?空闲?
        【解决方案5】:

        我没有足够的声誉发表评论,但above answer 不正确。

        Windows 有工作目录和工作驱动器的概念。 / 在您的当前工作驱动器上被视为绝对路径,因为 Windows 没有单根的概念。在上面的示例中,cd /FooBar 转到C:\foobar,因为工作驱动器是 C:,而不是因为 C: 是“根”驱动器或某种特殊的驱动器。

        这是一个例子:

        C:\Users\user> cd /
        C:\> d:
        D:\> cd /Users
        The system cannot find the path specified.
        D:\> mkdir test
        D:\> cd test
        D:\test> cd c:/Users
        D:\test> cd /
        D:\> cd test
        D:\test> c:
        C:\Users\> d:
        D:\test> 
        

        【讨论】:

          猜你喜欢
          • 2011-10-17
          • 2013-05-23
          • 2020-07-29
          • 2012-12-06
          • 2010-12-29
          • 1970-01-01
          相关资源
          最近更新 更多