当前位置: 首页 > 面试题库 >

python中路径的跨平台拆分

倪棋
2023-03-14
问题内容

我想要具有与之相同的效果的东西:

>>> path = "/foo/bar/baz/file"
>>> path_split = path.rsplit('/')[1:]
>>> path_split
['foo', 'bar', 'baz', 'file']

但这也适用于Windows路径。我知道这里有一个,os.path.split()但是并不能满足我的要求,而且我也没有看到任何可以满足要求的东西。


问题答案:

OP指定“也将适用于Windows路径”。Windows路径有一些折痕。

首先,Windows有多个驱动器的概念,每一个都有自己当前的工作目录,'c:foo''c:\\foo'往往是不一样的。因此,最好先使用os.path.splitdrive()分离出任何驱动器指示符。然后可以通过以下方法正确地重新组装路径(如果需要)
drive + os.path.join(*other_pieces)

其次,Windows路径可以包含斜杠或反斜杠或混合使用。因此,os.sep在解析非规范化路径时使用是没有用的。

更普遍:

产生的结果'foo''foo/'不应相同。

最好以“ os.path.split()将其输入视为不可拆分”来表示循环终止条件。

这是一个建议的解决方案,带有测试,包括与@Spacedman解决方案的比较

import os.path

def os_path_split_asunder(path, debug=False):
    parts = []
    while True:
        newpath, tail = os.path.split(path)
        if debug: print repr(path), (newpath, tail)
        if newpath == path:
            assert not tail
            if path: parts.append(path)
            break
        parts.append(tail)
        path = newpath
    parts.reverse()
    return parts

def spacedman_parts(path):
    components = [] 
    while True:
        (path,tail) = os.path.split(path)
        if not tail:
            return components
        components.insert(0,tail)

if __name__ == "__main__":
    tests = [
        '',
        'foo',
        'foo/',
        'foo\\',
        '/foo',
        '\\foo',
        'foo/bar',
        '/',
        'c:',
        'c:/',
        'c:foo',
        'c:/foo',
        'c:/users/john/foo.txt',
        '/users/john/foo.txt',
        'foo/bar/baz/loop',
        'foo/bar/baz/',
        '//hostname/foo/bar.txt',
        ]
    for i, test in enumerate(tests):
        print "\nTest %d: %r" % (i, test)
        drive, path = os.path.splitdrive(test)
        print 'drive, path', repr(drive), repr(path)
        a = os_path_split_asunder(path)
        b = spacedman_parts(path)
        print "a ... %r" % a
        print "b ... %r" % b
        print a == b

这是输出(Python 2.7.1,Windows 7 Pro):

Test 0: ''
drive, path '' ''
a ... []
b ... []
True

Test 1: 'foo'
drive, path '' 'foo'
a ... ['foo']
b ... ['foo']
True

Test 2: 'foo/'
drive, path '' 'foo/'
a ... ['foo', '']
b ... []
False

Test 3: 'foo\\'
drive, path '' 'foo\\'
a ... ['foo', '']
b ... []
False

Test 4: '/foo'
drive, path '' '/foo'
a ... ['/', 'foo']
b ... ['foo']
False

Test 5: '\\foo'
drive, path '' '\\foo'
a ... ['\\', 'foo']
b ... ['foo']
False

Test 6: 'foo/bar'
drive, path '' 'foo/bar'
a ... ['foo', 'bar']
b ... ['foo', 'bar']
True

Test 7: '/'
drive, path '' '/'
a ... ['/']
b ... []
False

Test 8: 'c:'
drive, path 'c:' ''
a ... []
b ... []
True

Test 9: 'c:/'
drive, path 'c:' '/'
a ... ['/']
b ... []
False

Test 10: 'c:foo'
drive, path 'c:' 'foo'
a ... ['foo']
b ... ['foo']
True

Test 11: 'c:/foo'
drive, path 'c:' '/foo'
a ... ['/', 'foo']
b ... ['foo']
False

Test 12: 'c:/users/john/foo.txt'
drive, path 'c:' '/users/john/foo.txt'
a ... ['/', 'users', 'john', 'foo.txt']
b ... ['users', 'john', 'foo.txt']
False

Test 13: '/users/john/foo.txt'
drive, path '' '/users/john/foo.txt'
a ... ['/', 'users', 'john', 'foo.txt']
b ... ['users', 'john', 'foo.txt']
False

Test 14: 'foo/bar/baz/loop'
drive, path '' 'foo/bar/baz/loop'
a ... ['foo', 'bar', 'baz', 'loop']
b ... ['foo', 'bar', 'baz', 'loop']
True

Test 15: 'foo/bar/baz/'
drive, path '' 'foo/bar/baz/'
a ... ['foo', 'bar', 'baz', '']
b ... []
False

Test 16: '//hostname/foo/bar.txt'
drive, path '' '//hostname/foo/bar.txt'
a ... ['//', 'hostname', 'foo', 'bar.txt']
b ... ['hostname', 'foo', 'bar.txt']
False


 类似资料:
  • 问题内容: 我想在Unix和Windows上使用特定于平台的目录。请看一下代码: 这个输出 我想第二次打电话给(windows)类似 是否可以告诉我在Windows上运行的程序使用Windows分隔符?还是应该始终将反斜杠转换 为正斜杠()?这里首选的策略是什么? 问题答案: 我看到“问题”在哪里。在golang-nuts上的讨论为我提供了提示,该提示始终使用并且是用于依赖平台的操作的函数。 在W

  • 问题内容: 我正在使用以下代码在Linux / OSX上为Python库隐藏stderr,但我不控制默认情况下写入stderr的Python库: 是否有一个简单的跨平台替代/ dev / null?理想情况下,它不会消耗内存,因为这是一个长期运行的过程。 问题答案: os.devnull怎么样?

  • 问题内容: 我知道文件的相对路径,并希望将其作为 Linux和Windows上的对象来处理。 在Java中指定平台无关路径的最佳方法是什么? 问题答案: 本类包含可用于特定平台的文件路径下面的公共成员: 系统相关的路径分隔符,为方便起见,用字符串表示。 系统相关的路径分隔符。 系统相关的默认名称分隔符,为方便起见,以字符串形式表示。

  • 多平台支持 Mpx支持在多个小程序平台中进行增强,目前支持的小程序平台包括微信,支付宝,百度,qq和头条,不过自2.0版本后,Mpx支持了以微信增强语法为base的跨平台输出,实现了一套业务源码在多端输出运行的能力,大大提升了多小程序平台业务的开发效率,详情可以查看template增强特性 不同平台上的模板增强指令按照平台的指令风格进行设计,文档和代码示例为了方便统一采用微信小程序下的书写方式。

  • 问题内容: 我需要在python终端程序中监听某些按键,而不必使用暂停执行。我已经看到人们使用一些特定于Windows的方式来监听按键,并且我看到人们使用了诸如tkinter和pygame之类的大型模块,这些模块我想避免。 是否有一个轻量级的模块可以跨平台运行(至少是ubuntu,windows,mac)?还是有一种方法可以只使用来自tkinter,pygame等的事件系统? 如果没有,我应该如何

  • 问题内容: 您可能知道,Mac OS X中保存的快捷方式是 Windows ,而关闭应用程序的快捷方式是 Windows 。但是问题是如何在Java应用程序中执行这些操作?我是否需要查找我在应用程序中使用的所有快捷方式,并根据不同的操作系统来匹配相关功能?有什么建议吗?谢谢。 问题答案: 该方法在这种情况下很有用。该方法在Windows上返回时,在Mac OS X上返回。所得的掩码可用于构造菜单项