如何获取当前文件目录的完整路径?


799

我想获取当前文件的目录路径。我试过了:

>>> os.path.abspath(__file__)
'C:\\python27\\test.py'

但是如何检索目录的路径?

例如:

'C:\\python27\\'


5
__file__当您将python作为交互式shell运行时,未定义。您问题的第一部分代码看起来像是来自交互式外壳程序,但实际上NameError至少在python 2.7.3上会产生一个,但是我猜也有其他代码。
drevicko

Answers:


1628

Python 3

对于正在运行的脚本的目录:

import pathlib
pathlib.Path(__file__).parent.absolute()

对于当前工作目录:

import pathlib
pathlib.Path().absolute()

Python 2和3

对于正在运行的脚本的目录:

import os
os.path.dirname(os.path.abspath(__file__))

如果您的意思是当前工作目录:

import os
os.path.abspath(os.getcwd())

请注意,前后分别file是两个下划线,而不仅仅是一个。

另请注意,如果您正在交互运行或已从文件以外的内容(例如数据库或在线资源)中加载了代码,则__file__可能不会设置,因为没有“当前文件”的概念。上面的答案假设运行文件中的python脚本的最常见情况。

参考文献

  1. python文档中的pathlib
  2. os.path 2.7os.path 3.8
  3. os.getcwd 2.7os.getcwd 3.8
  4. __file__变量的含义/作用是什么?

43
如果您不想在Windows上发现怪异的行为(如果dirname(file)可能返回空字符串),则必须使用abspath()!
索林2011年

4
应该是os.path.dirname(os.path.abspath(os .__ file__))吗?
DrBailey 2014年

5
@DrBailey:不,关于ActivePython没有什么特别的。__file__(请注意,单词的两边都有两个下划线)是python的标准部分。例如,它在基于C的模块中不可用,但应始终在python脚本中可用。
Bryan Oakley

10
我建议使用realpath而不是abspath来解决可能的符号链接。
TTimo 2015年

12
@ cph2117:仅当您在脚本中运行它时,它才起作用。__file__如果是从交互式提示运行,则没有。\
布赖恩·奥克利

99

使用Path是因为Python 3的推荐方式:

from pathlib import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

文档:pathlib

注意:如果使用Jupyter Notebook,__file__则不会返回期望值,因此Path().absolute()必须使用。


17
我必须做的Path(__file__).parent是获取包含文件的文件夹
YellowPillow

@YellowPillow是正确的,Path(__file__)可以获取文件。 .parent使您上一层,即包含目录。您可以添加更多内容.parent以根据需要增加目录数。
罗恩·卡利安

1
抱歉,我应该已经弄清楚了,但是如果Path().absolute()位于中的某个模块中存在path/to/module并且您正在从位于中的某个脚本中调用该模块,path/to/script则它将返回path/to/script而不是path/to/module
YellowPillow

1
@YellowPillow Path(__file__).cwd()更明确
查理

1
Path(__file__)并不总是起作用,例如,在Jupyter Notebook中不起作用。 Path().absolute()解决了这个问题。
罗恩·卡利安

43

在Python 3.x中,我这样做:

from pathlib import Path

path = Path(__file__).parent.absolute()

说明:

  • Path(__file__) 是当前文件的路径。
  • .parent为您提供文件所在的目录
  • .absolute()给您完整的绝对路径。

使用pathlib是使用路径的现代方法。如果以后由于某种原因需要它作为字符串,只需执行str(path)


3
自2019年起,这应该是公认的答案。答案中也可能提到一件事:人们可以立即调用.open()例如Pathwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
stefanct

9
import os
print os.path.dirname(__file__)

21
抱歉,此答案不正确,正确的答案是Bryan`dirname(abspath(file))给出的答案。有关详细信息,请参见评论。
索林2011年

1
它将/ 作为输出给出
Tripathi29'9

2
@sorin实际上在Python 3.6上它们都是相同的
DollarAkshay

5

您可以轻松地使用os和存储os.path库,如下所示

import os
os.chdir(os.path.dirname(os.getcwd()))

os.path.dirname从当前目录返回上一级目录。它使我们可以在不传递任何文件参数且不知道绝对路径的情况下切换到更高级别。


7
这不会提供当前文件的目录。它返回当前工作目录的目录,该目录可能完全不同。您建议的内容仅在文件位于当前工作目录中时才有效。
Bryan Oakley


2

我发现以下命令将全部返回Python 3.6脚本的父目录的完整路径。

Python 3.6脚本:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from pathlib import Path

#Get the absolute path of a Python3.6 script
dir1 = Path().resolve()  #Make the path absolute, resolving any symlinks.
dir2 = Path().absolute() #See @RonKalian answer 
dir3 = Path(__file__).parent.absolute() #See @Arminius answer 

print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}')

说明链接:.resolve() .absolute() 路径(文件).parent()绝对的()。


2

系统:MacOS

版本:Python 3.6 w / Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

PYTHON中的有用路径属性:

 from pathlib import Path

    #Returns the path of the directory, where your script file is placed
    mypath = Path().absolute()
    print('Absolute path : {}'.format(mypath))

    #if you want to go to any other file inside the subdirectories of the directory path got from above method
    filePath = mypath/'data'/'fuel_econ.csv'
    print('File path : {}'.format(filePath))

    #To check if file present in that directory or Not
    isfileExist = filePath.exists()
    print('isfileExist : {}'.format(isfileExist))

    #To check if the path is a directory or a File
    isadirectory = filePath.is_dir()
    print('isadirectory : {}'.format(isadirectory))

    #To get the extension of the file
    fileExtension = mypath/'data'/'fuel_econ.csv'
    print('File extension : {}'.format(filePath.suffix))

输出: 绝对路径是放置Python文件的路径

绝对路径:D:\ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib和seaborn Part2

文件路径:D:\ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib和seaborn Part2 \ data \ fuel_econ.csv

isfileExist:真

isadirectory:错误

文件扩展名:.csv


1

如果您只想查看当前的工作目录

import os
print(os.getcwd)

如果要更改当前工作目录

os.chdir(path)

path是一个字符串,其中包含要移动的所需路径。例如

path = "C:\\Users\\xyz\\Desktop\\move here"

0

IPython有一个神奇的命令%pwd来获取当前的工作目录。它可以按以下方式使用:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

在IPython Jupyter Notebook上%pwd可以直接使用,如下所示:

present_working_directory = %pwd

5
问题不是关于IPython的
-Kiro,

1
@Kiro,我的解决方案使用IPython 回答了这个问题。例如,如果有人使用新库用解决方案回答了一个问题,那么恕我直言,它仍然是该问题的相关答案。
Nafeez Quraishi

@NafeezQuraishi您的解决方案引入了一个第三方库和一个类,您必须从该类中进行实例化才能获得所需的结果。我自己,我认为许多其他人出于多种原因尝试避免使用外部库,并且只有在没有其他方法起作用的情况下,我才会尝试使用您的解决方案。幸运的是,您可以使用一系列内置函数来获得所需的结果,而无需外部库。
elliotwesoff

@ elli0t,部分同意。考虑使用Jupyter笔记本的人有这个问题,对于谁来说使用%pwd magic命令可能比os import更容易,更可取。
Nafeez Quraishi

0

要保持跨平台(macOS / Windows / Linux)的迁移一致性,请尝试:

path = r'%s' % os.getcwd().replace('\\','/')

0

为了获取当前文件夹,我已经在CGI的IIS下运行python时使用了一个函数:

import os 
   def getLocalFolder():
        path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
        return path[len(path)-1]

0

假设您具有以下目录结构:-

主/折1折2折3 ...

folders = glob.glob("main/fold*")

for fold in folders:
    abspath = os.path.dirname(os.path.abspath(fold))
    fullpath = os.path.join(abspath, sch)
    print(fullpath)

-1
## IMPORT MODULES
import os

## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('') ## ~ os.getcwd()
## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..
## ..OR DIFFERENT IN SOME CIRCUMSTANCES

2
当前工作目录可能与当前文件的目录不同。仅当当前工作目录与保存文件的目录相同时,您的解决方案才能工作。这在开发过程中可能很常见,但是对于已部署的脚本来说通常很少见。
布莱恩·奥克利

谢谢(你的)信息。我更新了答案,以反映返回相同文件路径的可能性可能不相等。这就是为什么我坚持称为“增量编程”,测试和许多print()函数调用以测试输出和/或返回值的方式的编码原理的原因。我希望我的代码现在可以更好地反映os.path.abspath()与os.getcwd()的真实性,因为我并不声称自己了解一切。但是您可以看到,我把os.getcwd()放在注释中不是主要解决方案,而是作为一个值得记住和检查的替代代码。
耶路撒冷程序员

PS我觉得有人参加,如果他们的回答将要审查和切碎的编辑和删除的大部分我的回答,我这里贴... :(这种鼓励的人。
耶路撒冷程序员

1
您是唯一编辑此答案的人。此外,您的修改仍然无法正确回答问题。问题是专门询问文件目录的路径,您的答案仅提到获取当前目录。这不是正确的答案,因为当前目录通常与脚本所在的目录不同。这与无关abspath
布莱恩·奥克利

最肯定的是,如果从您想知道绝对文件路径的目录和/或文件运行,我共享的代码将提供文件目录的路径。无疑,这是一个正确的答案。请不要成为一个巨魔。
耶路撒冷程序员,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.