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

我如何确定:

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

当前工作目录#0

#0属性可以帮助您找出正在执行的文件的位置。这篇Stack Overflow文章解释了一切:如何在Python中获取当前执行文件的路径?

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

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

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


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

import oscwd = os.getcwd()

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

  • #0#1模块。
  • #0常量
  • #0(返回"指定文件名的规范路径,消除路径中遇到的任何符号链接"
  • #0(返回"路径名#1的目录名"
  • #0(返回"表示当前工作目录的字符串"
  • #0"将当前工作目录更改为#1"
  1. 获取当前目录的完整路径

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

    输出:“C:\用户\admin\我的文件夹”

  2. 仅获取当前目录文件夹名称

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

    输出:“我的文件夹”

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

OS不可知的方式:

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

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

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

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

我认为找到当前执行上下文名称的最简洁方法是:

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

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

有关此新API的更多信息,请参阅这里

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

os.path.realpath('.')

回答#1:

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

import osos.getcwd()

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

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

答案#2:

import osprint os.path.abspath(__file__)

Pathlib可以通过这种方式获取包含当前脚本的目录:

import pathlibfilepath = pathlib.Path(__file__).resolve().parent

对于问题1,使用os.getcwd() # Get working directoryos.chdir(r'D:\Steam\steamapps\common') # Set working directory


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

import osthis_py_file = os.path.realpath(__file__)
# vvv Below comes your code vvv #

但是这个代码段和sys.argv[0]在PyInstaller编译时不起作用,或者工作起来很奇怪,因为魔法属性没有在__main__级别设置,sys.argv[0]是调用可执行文件的方式(这意味着它会受到工作目录的影响)。

#0模块在Python 3.4中引入PEP 428-路径库模块-面向对象的文件系统路径)使与路径相关的体验更好。

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

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

from pathlib import Path
print(Path.cwd())  # /home/skovorodkin/stack

要获取脚本文件的绝对路径,请使用#0方法:

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

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

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

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


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

文件脚本/2.py

from pathlib import Path
p = Path(__file__).resolve()
with p.open() as f: passwith open(str(p)) as f: passwith 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中实现,在#1函数中添加了对#0对象的支持,因此现在您可以直接将Path对象传递给open函数:

python3.6 scripts/2.py
OK