【问题标题】:How to get upper paths from a single path?如何从单条路径获取上层路径?
【发布时间】:2009-03-26 22:52:38
【问题描述】:

如何从单条路径获取上层路径?

假设你有这样的路径:

'C:\a\b\c\d\'

如何到达'C:\a\b''C:\a\b\c'

有没有pythonic方法可以做到这一点?

【问题讨论】:

    标签: python directory


    【解决方案1】:

    os.path

    from os import path
    path.dirname("C:\\a\\b\\c\\d\\")
    

    【讨论】:

    • 不,如果你做了'from os import path',你会把它称为path.dirname。
    【解决方案2】:

    有一些基本的东西,比如os.path 方法。

    如果您想要目录树中每个连续父级的完整路径名列表,这里有一个衬里:

    from os.path import dirname
    
    def f1(n): return [n] if n == dirname(n) else [n] + f1(dirname(n))
    
    print f1("/a/b/c/d/e/f/g")
    

    【讨论】:

      【解决方案3】:

      os.path.split("C:\\a\\b\\c") 将返回一个元组:

      ('C:\a\b', 'c')
      

      您可以继续在元组的第一个元素上调用 split。

      【讨论】:

      • 您正在复制标准库的功能,它更健壮(如果您的示例路径以“\”结尾怎么办?)并且更便携(您的示例在 linux 下不起作用)
      【解决方案4】:
      >>> def go_up(path, n):
      ...     return os.path.abspath(os.path.join(*([path] + ['..']*n)))
      >>> path = 'C:\\a\\b\\c\\d\\'
      >>> go_up(path, 2)
      'C:\\a\\b'
      >>> go_up(path, 1)
      'C:\\a\\b\\c'
      >>> go_up(path, 0)
      'C:\\a\\b\\c\\d'
      

      不是os.path 的普通用户,我不知道这是否是一个合适的/pythonic 解决方案。我把它比作一个替代函数,定义如下:

      def go_up_2(path, n):
          for i in xrange(n):
              path = os.path.split(path)[0]
          return path
      

      首先要注意的是go_up_2('C:\\a\\b\\', 1) != go_up_2('c:\\a\\b', 1),它与原始go_up 相同。但是,如果这是一个问题,性能会显着提高(可能不是,但我正在寻找一些明确的方式来说明我自己的算法更好):

      import timeit
      
      g1 = """import os.path
      import ntpath
      os.path = ntpath
      def go_up(path, n):
          return os.path.abspath(os.path.join(*([path] + ['..']*n)))"""
      
      g2 = """import os.path
      import ntpath
      os.path = ntpath
      def go_up(path, n):
          for i in xrange(n-1):
              path = os.path.split(path)[0]
          return path"""
      
      t1 = timeit.Timer("go_up('C:\\a\\b\\c\\d', 3)", setup=g1).timeit()
      t2 = timeit.Timer("go_up('C:\\a\\b\\c\\d', 3)", setup=g2).timeit()
      
      print t1
      print t2
      

      这个输出(在我的机器上):

      133.364659071
      30.101334095
      

      不是很有用的信息,但我正在玩,并认为无论如何都应该在这里发布。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多