关于python:查找当前目录和文件目录

Find current directory and file's directory

本问题已经有最佳答案,请猛点这里访问。

在python中,我可以使用哪些命令来查找:

  • 当前目录(运行python脚本时我在终端中的位置),以及
  • 我正在执行的文件在哪里?

  • 要获取包含python文件的目录的完整路径,请将其写入该文件:

    1
    2
    import os
    dir_path = os.path.dirname(os.path.realpath(__file__))

    (注意,如果您已经使用os.chdir()来更改当前的工作目录,上面的咒语将不起作用,因为__file__常量的值与当前的工作目录相关,并且不会被os.chdir()调用更改。)

    要获取当前工作目录,请使用

    1
    2
    import os
    cwd = os.getcwd()

    上述模块、常量和函数的文档参考:

    • osos.path模块。
    • __file__常数
    • os.path.realpath(path)(返回"指定文件名的规范路径,消除路径中遇到的任何符号链接")。
    • os.path.dirname(path)(返回路径名path的目录名)
    • os.getcwd()(返回"表示当前工作目录的字符串")
    • os.chdir(path)(将当前工作目录改为path)


    当前工作目录:os.getcwd()

    __file__属性可以帮助您找到正在执行的文件所在的位置。这篇文章解释了所有的事情:我如何在python中获取当前执行文件的路径?


    您可能会发现这是一个有用的参考:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import os

    print("Path at terminal when executing this file")
    print(os.getcwd() +"
    "
    )

    print("This file path, relative to os.getcwd()")
    print(__file__ +"
    "
    )

    print("This file full path (following symlinks)")
    full_path = os.path.realpath(__file__)
    print(full_path +"
    "
    )

    print("This file directory and name")
    path, filename = os.path.split(full_path)
    print(path + ' --> ' + filename +"
    "
    )

    print("This file directory only")
    print(os.path.dirname(full_path))


    1.获取当前目录的完整路径

    1
    2
        >>import os
        >>print os.getcwd()

    O/P:"C:usersadminmyfolder"

    1.单独获取当前目录文件夹名称

    1
    2
    3
    4
    5
        >>import os
        >>str1=os.getcwd()
        >>str2=str1.split('\')
        >>n=len(str2)
        >>print str2[n-1]

    O/P:"MyF夹"


    python 3.4中引入的pathlib模块(pep 428—pathlib模块—面向对象的文件系统路径)使路径相关的体验更好。

    1
    2
    3
    4
    5
    6
    7
    $ pwd
    /home/skovorodkin/stack
    $ tree
    .
    └── scripts
        ├── 1.py
        └── 2.py

    要获得当前工作目录,请使用Path.cwd()

    1
    2
    3
    from pathlib import Path

    print(Path.cwd())  # /home/skovorodkin/stack

    要获得脚本文件的绝对路径,请使用Path.resolve()方法:

    1
    print(Path(__file__).resolve())  # /home/skovorodkin/stack/scripts/1.py

    要获取脚本所在目录的路径,请访问.parent(建议在.parent之前调用.resolve()

    1
    print(Path(__file__).resolve().parent)  # /home/skovorodkin/stack/scripts

    记住,在某些情况下,__file__是不可靠的:如何在python中获取当前执行文件的路径?.

    请注意,Path.cwd()Path.resolve()和其他Path方法返回路径对象(在我的例子中是PosixPath),而不是字符串。在python 3.4和3.5中,由于open内置函数只能处理字符串或字节对象,不支持Path对象,因此必须将Path对象转换为字符串或使用Path.open()方法,但后者要求您更改旧代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ cat scripts/2.py
    from pathlib import Path

    p = Path(__file__).resolve()

    with p.open() as f: pass
    with open(str(p)) as f: pass
    with open(p) as f: pass

    print('OK')

    $ python3.5 scripts/2.py
    Traceback (most recent call last):
      File"scripts/2.py", line 11, in <module>
        with open(p) as f:
    TypeError: invalid file: PosixPath('/home/skovorodkin/stack/scripts/2.py')

    如您所见,open(p)不适用于Python3.5。

    PEP 519—添加一个在python 3.6中实现的文件系统路径协议,增加了对PathLike对象对open函数的支持,现在可以直接将Path对象传递给open函数:

    1
    2
    $ python3.6 scripts/2.py
    OK


    如果您试图查找当前所在文件的当前目录:

    操作系统不可知方式:

    1
    dirname, filename = os.path.split(os.path.abspath(__file__))


    如果您使用的是python 3.4,那么有一个全新的更高级的pathlib模块,它允许您方便地调用pathlib.Path.cwd()来获取表示当前工作目录的path对象,以及许多其他新功能。

    关于这个新API的更多信息可以在这里找到。


    对第1题的回答:

    如果需要当前目录,请执行以下操作:

    1
    2
    import os
    os.getcwd()

    如果只需要任何文件夹名,并且您有该文件夹的路径,请执行以下操作:

    1
    2
    3
    4
    5
    def get_folder_name(folder):
        '''
        Returns the folder name, given a full folder path
        '''

        return folder.split(os.sep)[-1]

    对第2题的回答:

    1
    2
    import os
    print os.path.abspath(__file__)


    参加聚会有点晚,但我认为找到当前执行上下文名称的最简单方法是

    1
    current_folder_path, current_folder_name = os.path.split(os.getcwd())

    pathlib可以用这种方式获取包含当前脚本的目录:

    1
    2
    import pathlib
    filepath = pathlib.Path(__file__).resolve().parent


    要获取当前目录的完整路径:

    os.path.realpath('.')


    如果要搜索当前执行脚本的位置,可以使用sys.argv[0]获取完整路径。


    要查看当前工作目录,请键入以下脚本:

    1
    2
    import os
    current_working_directory = os.getcwd()


    对于问题1,使用os.getcwd() # get working diros.chdir(r'D:\Steam\steamapps\common') # set working dir

    我建议对问题2使用sys.argv[0],因为sys.argv是不可变的,因此总是返回当前文件(模块对象路径),而不受os.chdir()的影响。你也可以这样做:

    1
    2
    3
    4
    import os
    this_py_file = os.path.realpath(__file__)

    # vvv Below comes your code vvv #

    但当pyinstaller编译时,该代码段和sys.argv[0]将不工作或不工作,因为在__main__级别中没有设置magic属性,而sys.argv[0]是调用exe的方式(意味着它会受到工作目录的影响)。


    在python中获取工作目录。您可以使用以下代码:

    1
    2
    3
    import os
    cwd = os.getcwd() #to get current working directory
    print(cwd)