题 查找当前目录和文件的目录[重复]


这个问题在这里已有答案:

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

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

1501
2018-02-28 01:51


起源


不是“如何在Python中获取当前目录的完整路径?”的副本因为这个问题也要求当前的工作目录,但事实并非如此。 - Josiah Yoder
这使它成为两个问题 - Mawg


答案:


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

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

(请注意,如果您已使用过,则上述咒语将无法使用 os.chdir() 改变你当前的工作目录,因为它的值 __file__ constant是相对于当前工作目录的,不会被更改 os.chdir() 呼叫。)


要使用当前工作目录

import os
cwd = os.getcwd()

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


2284
2018-02-28 01:54



当我使用它追加到sys.path时,我讨厌它。我现在感觉很脏 - FlipMcF
文件 如果从IDE(比如IDLE)调用,则无效。建议使用os.path.realpath('./')或os.getcwd()。最好的灵感来自: stackoverflow.com/questions/2632199/... - Neon22
@ Neon22可能适合某些需求,但我觉得应该注意那些东西根本不相同 - 文件可以在工作目录之外。 - Mark
如何扭转秩序,这有关系吗? os.path.realpath(os.path.dirname(__file__)) - Moberg
@Moberg倒车时路径通常是相同的 realpath 同 dirname,但当文件(或其目录)实际上是符号链接时,它会有所不同。 - Lekensteyn


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

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


272
2018-02-28 01:53





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

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))

227
2017-12-05 10:18



是什么 __file__ 在这里表示什么?它对我不起作用。 - Alex Raj Kaliamoorthy
该 __file__ 是模块对象的属性。您需要在Python文件中运行代码,而不是在REPL上运行。 - Daniel Reis


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

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

o / p:“C:\ Users \ admin \ myfolder”

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

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

O / P: “MyFolder文件”


47
2018-04-24 07:00



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


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

OS不可知的方式:

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

33
2017-10-07 09:10





回答#1:

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

import os
os.getcwd()

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

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

回答#2:

import os
print os.path.abspath(__file__)

26
2017-11-05 09:31



我不知道你怎么没有竖起大拇指。 - Malachi Bazar
这个答案是1.但不是2。 - leo


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

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

25
2017-10-09 10:31





如果你使用的是Python 3.4,那就是全新的更高级别 pathlib 模块,让您方便地打电话 pathlib.Path.cwd() 得到一个 Path 表示当前工作目录的对象,以及许多其他新功能。

可以找到有关此新API的更多信息 这里


24
2018-02-20 20:32



对于Python版本<3.4,您可以使用 pathlib2: pypi.python.org/pypi/pathlib2 - Eyal Levin


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

$ pwd
/home/skovorodkin/stack
$ tree
.
└── scripts
    ├── 1.py
    └── 2.py

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

from pathlib import Path

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

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

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

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

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() 方法,但后一个选项要求您更改旧代码:

$ 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) 不适用于Python 3.5。

PEP 519 - 添加文件系统路径协议,在Python 3.6中实现,增加了对 PathLike 对象 open 功能,所以现在你可以通过 Path 对象 open 功能直接:

$ python3.6 scripts/2.py
OK

21
2017-09-05 19:14