python: get directory two levels up

后端 未结 12 1929
清歌不尽
清歌不尽 2021-01-30 06:00

Ok...I dont know where module x is, but I know that I need to get the path to the directory two levels up.

So, is there a more elegant way to do:

         


        
相关标签:
12条回答
  • 2021-01-30 06:40

    I don't yet see a viable answer for 2.7 which doesn't require installing additional dependencies and also starts from the file's directory. It's not nice as a single-line solution, but there's nothing wrong with using the standard utilities.

    import os
    
    grandparent_dir = os.path.abspath(  # Convert into absolute path string
        os.path.join(  # Current file's grandparent directory
            os.path.join(  # Current file's parent directory
                os.path.dirname(  # Current file's directory
                    os.path.abspath(__file__)  # Current file path
                ),
                os.pardir
            ),
            os.pardir
        )
    )
    
    print grandparent_dir
    

    And to prove it works, here I start out in ~/Documents/notes just so that I show the current directory doesn't influence outcome. I put the file grandpa.py with that script in a folder called "scripts". It crawls up to the Documents dir and then to the user dir on a Mac.

    (testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py 
    /Users/alancoding/Documents/scripts/grandpa.py
    (testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py 
    /Users/alancoding
    

    This is the obvious extrapolation of the answer for the parent dir. Better to use a general solution than a less-good solution in fewer lines.

    0 讨论(0)
  • 2021-01-30 06:41

    Personally, I find that using the os module is the easiest method as outlined below. If you are only going up one level, replace ('../..') with ('..').

        import os
        os.chdir('../..')
    
    --Check:
        os.getcwd()
    
    0 讨论(0)
  • 2021-01-30 06:42

    More cross-platform implementation will be:

    import pathlib
    two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
    

    Using parent is not supported on Windows. Also need to add .resolve(), to:

    Make the path absolute, resolving all symlinks on the way and also normalizing it (for example turning slashes into backslashes under Windows)

    0 讨论(0)
  • 2021-01-30 06:47

    The best solution (for python >= 3.4) when executing from any directory is:

    from pathlib import Path
    two_up = Path(__file__).resolve().parents[1]
    
    0 讨论(0)
  • 2021-01-30 06:54

    You can use this as a generic solution:

    import os
    
    def getParentDir(path, level=1):
      return os.path.normpath( os.path.join(path, *([".."] * level)) )
    
    0 讨论(0)
  • 2021-01-30 06:57

    I was going to add this just to be silly, but also because it shows newcomers the potential usefulness of aliasing functions and/or imports.

    Having written it, I think this code is more readable (i.e. lower time to grasp intention) than the other answers to date, and readability is (usually) king.

    from os.path import dirname as up
    
    two_up = up(up(__file__))
    

    Note: you only want to do this kind of thing if your module is very small, or contextually cohesive.

    0 讨论(0)
提交回复
热议问题