【问题标题】:How to get the parent dir location如何获取父目录位置
【发布时间】:2011-02-18 12:34:14
【问题描述】:

这段代码是在b.py中获取templates/blog1/page.html:

path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))

但我想获取父目录位置:

aParent
   |--a
   |  |---b.py
   |      |---templates
   |              |--------blog1
   |                         |-------page.html
   |--templates
          |--------blog1
                     |-------page.html

以及如何获取父位置

谢谢

更新:

这是对的:

dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))

path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))

【问题讨论】:

  • 所以你想得到blog1a?您当前的文件在哪里?
  • 你了解你的代码在做什么吗?
  • 是的,它得到了templates/blog1/page.html
  • os.path.join('templates', 'blog1/page.html') 对我来说看起来很奇怪。你把事情搞混了。 os.path.join('templates', 'blog1', 'page.html')'templates/blog1/page.html'。然后更容易的是os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
  • @zjm:不,你没有得到那个页面。它不是你可以用来获取模板文件的黑盒。它执行了一系列琐碎的小步骤,如果你能理解它们,你就不会有这个问题。

标签: python path


【解决方案1】:

您可以重复应用 dirname 以爬得更高:dirname(dirname(file))。但是,这只能到根包。如果这是一个问题,请使用os.path.abspathdirname(dirname(abspath(file)))

【讨论】:

  • 我知道 OP 知道 dirname。对每个人来说,将 dirname 应用于目录会产生父目录并不是很明显。
  • dirname NOT 总是返回父目录; twitter.com/#!/ActiveState/status/671049326788608
  • @Sridhar:这取决于你的观点;我认为以/ 结尾的路径不代表叶目录条目本身,而是它的内容,这就是为什么如果yyy 不是预先存在的目录,则mv xxx yyy/ 会失败。无论如何,即使我们认为您的观点是给定的,这与我的回答无关。 filedirname 的结果都不会以 / 结尾。
  • 次要更正:dirname 可能会返回 '/',它显然以 / 结尾。这是唯一的例外,AFAIK。
【解决方案2】:

os.path.abspath 不验证任何内容,因此如果我们已经将字符串附加到__file__,则无需为dirname 或加入或任何其他操作而烦恼。把__file__当成一个目录就可以开始爬了:

# climb to __file__'s parent's parent:
os.path.abspath(__file__ + "/../../")

这远没有os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) 复杂,并且与dirname(dirname(__file__)) 一样易于管理。爬两层以上开始变得荒谬。

但是,既然我们知道要爬多少级,我们可以用一个简单的小函数来清理它:

uppath = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n])

# __file__ = "/aParent/templates/blog1/page.html"
>>> uppath(__file__, 1)
'/aParent/templates/blog1'
>>> uppath(__file__, 2)
'/aParent/templates'
>>> uppath(__file__, 3)
'/aParent'

【讨论】:

  • 这很好,但如果标准库添加了一个方便的函数来完成这个也很酷......不想每次我需要这个函数时都来SO
  • os.path.abspath(os.path.join(__file__, "..", "..") 会更便携吗?
【解决方案3】:

在 Python 3.4+ 中将 相对路径pathlib 模块一起使用:

from pathlib import Path

Path(__file__).parent

您可以多次调用parent 以在路径中走得更远:

Path(__file__).parent.parent

作为指定parent 两次的替代方法,您可以使用:

Path(__file__).parents[1]

【讨论】:

  • 如果您需要将路径作为字符串,因为您想修改它,您可以使用str(Path(__file__).parent)
  • 看来在python 3.8.5中你需要Path(__file__).resolve().parent
  • 谢谢,我知道.parent,但不知道.parents。 IMO,这比链接 .parentos.path.dirnames 要好得多。
【解决方案4】:
os.path.dirname(os.path.abspath(__file__))

应该给你a的路径。

但是如果b.py是当前正在执行的文件,那么你可以通过这样做来达到同样的效果

os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))

【讨论】:

  • o,我知道,你是对的,我想获取 a 的父文件夹。如何获得它
  • @zjm1126:见 Marcelo Cantos 的回答。申请dirname() 两次。您现在需要的一切都应该在这个网站上。
【解决方案5】:

os.pardir../ 更好的方式并且更具可读性。

import os
print os.path.abspath(os.path.join(given_path, os.pardir))  

这将返回给定路径的父路径

【讨论】:

    【解决方案6】:

    一个简单的方法可以是:

    import os
    current_dir =  os.path.abspath(os.path.dirname(__file__))
    parent_dir = os.path.abspath(current_dir + "/../")
    print parent_dir
    

    【讨论】:

      【解决方案7】:

      可以加入两个..文件夹,获取父文件夹的父文件夹吗?

      path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"..",".."))
      

      【讨论】:

        【解决方案8】:

        使用以下跳转到上一个文件夹:

        os.chdir(os.pardir)
        

        如果您需要多次跳转,那么在这种情况下使用简单的装饰器是一个很好且简单的解决方案。

        【讨论】:

          【解决方案9】:

          这是另一个相对简单的解决方案:

          • 不使用dirname()(在像“file.txt”这样的一级参数或像“..”这样的相对父级上不能按预期工作)
          • 不使用abspath()(避免对当前工作目录进行任何假设)而是保留路径的相对字符

          它只使用normpathjoin

          def parent(p):
              return os.path.normpath(os.path.join(p, os.path.pardir))
          
          # Example:
          for p in ['foo', 'foo/bar/baz', 'with/trailing/slash/', 
                  'dir/file.txt', '../up/', '/abs/path']:
              print parent(p)
          

          结果:

          .
          foo/bar
          with/trailing
          dir
          ..
          /abs
          

          【讨论】:

            【解决方案10】:

            我觉得用这个比较好:

            os.path.realpath(__file__).rsplit('/', X)[0]
            
            
            In [1]: __file__ = "/aParent/templates/blog1/page.html"
            
            In [2]: os.path.realpath(__file__).rsplit('/', 3)[0]
            Out[3]: '/aParent'
            
            In [4]: __file__ = "/aParent/templates/blog1/page.html"
            
            In [5]: os.path.realpath(__file__).rsplit('/', 1)[0]
            Out[6]: '/aParent/templates/blog1'
            
            In [7]: os.path.realpath(__file__).rsplit('/', 2)[0]
            Out[8]: '/aParent/templates'
            
            In [9]: os.path.realpath(__file__).rsplit('/', 3)[0]
            Out[10]: '/aParent'
            

            【讨论】:

            • 不完全是,它取决于操作系统(不适用于 Windows)。它也不允许使用相对路径。
            【解决方案11】:

            我试过了:

            import os
            os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))
            

            【讨论】:

              猜你喜欢
              • 2022-10-13
              • 1970-01-01
              • 2014-07-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-06-18
              • 1970-01-01
              相关资源
              最近更新 更多