查找当前目录和文件的目录

Joh*_*ard 2007 python directory

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

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

Rus*_*ias 3144

要获取包含Python文件的目录的完整路径,请在该文件中写入:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__))
Run Code Online (Sandbox Code Playgroud)

(请注意,如果您已经习惯os.chdir()更改当前工作目录,则上述咒语将不起作用,因为__file__常量的值是相对于当前工作目录的,并且不会被os.chdir()调用更改.)


要使用当前工作目录

import os
cwd = os.getcwd()
Run Code Online (Sandbox Code Playgroud)

上面使用的模块,常量和函数的文档参考:

  • 当我使用它追加到sys.path时,我讨厌它.我现在感觉很脏 (90认同)
  • 如果从IDE(比如IDLE)调用,__ file__将不起作用.建议os.path.realpath('./')或os.getcwd().最好的在线:http://stackoverflow.com/questions/2632199/how-do-i-get-the-path-of-the-current-executed-file-in-python?lq = 1 (5认同)
  • 它得到一个错误`NameError: name '__file__' is not defined`。如何解决这个问题? (3认同)
  • @ Neon22可能适合某些需求,但是我觉得应该注意的是,这些东西根本不一样-文件可以位于工作目录之外。 (2认同)
  • 颠倒顺序怎么样,有关系吗?`os.path.realpath(os.path.dirname(__file__))` (2认同)
  • @Moberg当使用`dirname`反转`realpath`时,路径通常是相同的,但是当文件(或其目录)实际上是符号链接时它会有所不同. (2认同)
  • `os.path.dirname(__file__)` 与我的代码中的 `os.path.dirname(os.path.realpath(__file__))` 执行相同的操作 (2认同)
  • 只要确保你使用`"__file__"` (2认同)

Nix*_*Nix 311

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

__file__属性 可以帮助您找出正在执行的文件所在的位置.这篇SO帖子解释了一切: 如何在Python中获取当前执行文件的路径?


Dan*_*eis 267

您可能会发现这有用作为参考:

import os

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

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

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

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

print("This file directory only")
print(os.path.dirname(full_path))
Run Code Online (Sandbox Code Playgroud)

  • `__ file__`在这里表示什么?它对我不起作用. (9认同)
  • `__file__`是模块对象的一个​​属性.您需要在Python文件中运行代码,而不是在REPL上运行. (7认同)

sko*_*kin 72

pathlib模块,在Python 3.4(PEP 428 - pathlib模块 - 面向对象的文件系统路径)中引入,使路径相关的体验更好.

$ pwd
/home/skovorodkin/stack
$ tree
.
??? scripts
    ??? 1.py
    ??? 2.py
Run Code Online (Sandbox Code Playgroud)

为了获得当前的工作目录Path.cwd():

from pathlib import Path

print(Path.cwd())  # /home/skovorodkin/stack
Run Code Online (Sandbox Code Playgroud)

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

print(Path(__file__).resolve())  # /home/skovorodkin/stack/scripts/1.py
Run Code Online (Sandbox Code Playgroud)

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

print(Path(__file__).resolve().parent)  # /home/skovorodkin/stack/scripts
Run Code Online (Sandbox Code Playgroud)

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


请注意,这Path.cwd(),Path.resolve()和其他Path方法返回的路径对象(PosixPath在我的情况),而不是字符串.在Python 3.4和3.5中引起了一些痛苦,因为open内置函数只能用于字符串或字节对象,并且不支持Path对象,所以你必须将Path对象转换为字符串或使用Path.open()方法,但后一个选项需要你改变旧代码:

$ 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')
Run Code Online (Sandbox Code Playgroud)

如您所见open(p),不适用于Python 3.5.

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

$ python3.6 scripts/2.py
OK
Run Code Online (Sandbox Code Playgroud)

  • 还要注意,这些方法是可链接的,因此如果需要,您可以将`app_path = Path(__ file __)。resolve()。parent.parent.parent`与`../../../`并行使用。 (2认同)

小智 58

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

    >>import os
    >>print os.getcwd()
Run Code Online (Sandbox Code Playgroud)

o/p:"C:\ Users\admin\myfolder"

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

    >>import os
    >>str1=os.getcwd()
    >>str2=str1.split('\\')
    >>n=len(str2)
    >>print str2[n-1]
Run Code Online (Sandbox Code Playgroud)

O/P: "MyFolder文件"

  • 最好使用os.sep而不是Windows的硬编码:os.getcwd().split(os.sep)[ - 1] (48认同)
  • 我认为最好在一行中做到:`os.getcwd().split('\\')[ - 1]` (11认同)
  • 这种方法的问题在于,如果从不同的目录执行脚本,您将获得该目录的名称而不是脚本,这可能不是您想要的. (4认同)
  • 是的,当前托管文件的目录可能不是您的 CWD (2认同)

小智 38

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

OS不可知的方式:

dirname, filename = os.path.split(os.path.abspath(__file__))
Run Code Online (Sandbox Code Playgroud)


Jaz*_*zer 31

如果您使用的是Python 3.4,则可以使用全新的高级pathlib模块,它可以方便地调用pathlib.Path.cwd()以获取Path表示当前工作目录的对象以及许多其他新功能.

有关此新API的更多信息,请访问此处.

  • 对于Python版本<3.4,您可以使用`pathlib2`:https://pypi.python.org/pypi/pathlib2/ (2认同)

Bla*_*g23 28

回答#1:

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

import os
os.getcwd()
Run Code Online (Sandbox Code Playgroud)

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

def get_folder_name(folder):
    '''
    Returns the folder name, given a full folder path
    '''
    return folder.split(os.sep)[-1]
Run Code Online (Sandbox Code Playgroud)

回答#2:

import os
print os.path.abspath(__file__)
Run Code Online (Sandbox Code Playgroud)


Sto*_*dow 27

派对有点晚了,但我认为找到当前执行上下文名称的最简洁方法是

current_folder_path, current_folder_name = os.path.split(os.getcwd())
Run Code Online (Sandbox Code Playgroud)


Mat*_* C. 19

可以使用Pathlib来获取包含当前脚本的目录:

import pathlib
filepath = pathlib.Path(__file__).resolve().parent
Run Code Online (Sandbox Code Playgroud)

  • @Kimmo 您应该使用 Python 2 代码的唯一原因是将其转换为 Python 3。 (3认同)
  • 对于 python 3.3 及更早版本,必须安装 pathlib (2认同)

Ili*_* S. 18

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

os.path.realpath( '')

  • 这个工作从一个jupyter iPython笔记本内部('______和getcwd不会) (5认同)
  • 我正在使用 Jupyter Notebook 远程工作:`os.getcwd()` 和 `os.path.realpath('.') 返回完全相同的字符串路径。 (3认同)
  • 还是有效.感谢未来@OliverZendel! (2认同)

Gro*_*hni 17

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

  • 这是错的.`sys.argv [0]`不需要包含执行脚本的*full*路径. (8认同)

Vla*_*rov 8

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


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

import os
this_py_file = os.path.realpath(__file__)

# vvv Below comes your code vvv #
Run Code Online (Sandbox Code Playgroud)

但是,sys.argv[0]当PyInstaller编译时,该片段将无效或无法正常工作,因为魔法属性未在__main__级别中设置,并且sys.argv[0]是您调用exe的方式(意味着它会受到工作目录的影响).