如何在Python中获取绝对文件路径

1024

如何在Python中找到给定路径(例如"mydir/myfile.txt")的文件的绝对路径?例如,在Windows上,可能会得到以下结果:

"C:/example/cwd/mydir/myfile.txt"
11个回答

1480
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

如果已经是绝对路径,也同样适用:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

43
注意:在大多数平台上,这相当于调用函数normpath()如下所示:normpath(join(os.getcwd(), path))。因此,如果mydir/myfile.txt不在os.getcwd()下,则绝对路径不是真实路径。 - coanor
41
如果没有明确的根目录,mydir/myfile.txt 隐含地指的是当前工作目录下的路径,因此等同于 ./mydir/myfile.txt。这可能不是你想要输入的路径,但就我所知,这似乎是该路径的正确解释。你能否详细说明一下? - jpmc26
2
@jpmc26 我不完全明白coanor的意思,但我认为(与我预想的相反),abspath函数的参数与实际文件之间没有任何联系。你可以给出任何路径名-不存在的文件和目录结构都可以- abspath将简单地解析路径的位(包括父目录".."元素)并返回一个字符串。这只是从当前目录计算出的字符串;似乎与实际文件的任何关联都是偶然的。尝试os.path.abspath("/wow/junk/../blha/hooey")。它可以工作。 - Mike S
2
@MikeS,老实说我不确定为什么这会是意料之外的行为。它是绝对路径,而不是绝对文件或目录。如果您想要一个存在性检查,请调用os.path.exists。相反,像PowerShell这样坚持使用标准路径解析函数存在路径的系统很难使用。 - jpmc26
1
@jpmc26 你说得没错,但那不是我的观点。如果你必须要忘记 getcwd,请重新阅读我的帖子。我的观点是:文档不准确。他们 readily blended 路径名的概念,将其视为真正的路径名与仅是可能引用文件系统中路径名的字符串之间的区别。在文档的其他地方,他们费尽心思地指出了这种差异,因为存在这种差异。再次强调,路径名的定义并不是它只是一个简单的字符串。abspath 的参数就是一个简单的字符串。这是我的最后一条评论;对于耽误你的时间我深表歉意。 - Mike S
显示剩余3条评论

127
你可以使用新的 Python 3.4 库 pathlib。(你也可以使用 pip install pathlib 在 Python 2.6 或 2.7 中获取它。)作者写道:“该库的目标是提供一个简单的类层次结构,用于处理文件系统路径和用户对其执行的常见操作。”
要在 Windows 中获取绝对路径:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'

或在UNIX上:

>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'

文档在这里:https://docs.python.org/3/library/pathlib.html


6
非常有帮助。使用 os.path.abspath() 时出现错误:AttributeError: 'NoneType' object has no attribute 'startswith',而使用 Path().resolve() 则不能解决相同的相对文件路径问题。(在Linux和Python3.4上) - NuclearPeon
3
根据我的实验结果,在Windows平台上,只有resolve()能够找到文件时才会返回完整路径。但是,即使文件不存在,os.path.abspath也会返回完整路径。然而,在Linux上,它总是返回绝对路径。 - Mond Wan
为什么在导入一个包的同时使用 Path(__file__) 而不是 resolve 方法时,会返回绝对路径而不是相对路径? - aderchox
1
请注意,resolve() 将遵循符号链接。如果不想这样做,请使用 absolute(),它将不解析符号链接。 - BallpointBen

36
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
注意,在Unix系统中,如果文件(或目录)的名称和位置所给表达式可能包含前导字符“~/”(波浪线表示用户的主目录),则需要使用expanduser函数。而expandvars函数可以处理其他环境变量(如$HOME)。

1
我知道这是一个相当老的答案,但是难道没有一个命令可以在一次调用中完成所有这些操作吗?似乎这将使传入路径最灵活,因此经常需要(至少在我的情况下是这样)。 - Florian Blume

31

安装第三方path模块(可在PyPI上找到),它将所有的os.path函数和其他相关函数封装成一个对象的方法,可以在任何需要字符串的地方使用:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'

3
很遗憾,他们从未将适当的文件名抽象模块纳入标准库。 - Torsten Marek
1
@Torsten Marek:这是一个痛点和长期存在的遗漏。 - flow
6
他们现在针对Python 3.4推出了pathlib。请查看我在此线程中的回答。 - twasbrillig
1
这个答案中有yypos。应该是from path import Path,然后Path('mydir/myfile.txt').abspath() - Frak
1
没有拼写错误,可能您使用了不同的“path”模块。链接的模块使用了一个名为“path”的类。 - Tom

27

针对Python 3.4+的更新,pathlib实际上回答了这个问题:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

如果你只需要一个临时字符串,请记住你可以使用 Path 对象和 os.path 中所有相关的函数,当然包括abspath

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

18

即使在另一个脚本中调用时,此代码始终可以获取当前脚本的正确文件名。在使用subprocess时尤其有用。

import sys,os

filename = sys.argv[0]

通过此方式,您可以使用以下代码获取脚本的完整路径:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

通过多次添加/..,可以更轻松地导航文件夹以向上访问目录层次结构。

要获取当前工作目录:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

对于父路径:

>>> os.path.abspath(filename+"/../..")
'/foo'

通过将"/.."与其他文件名结合使用,您可以访问系统中的任何文件。


2
这不是被问到的内容。他们询问与当前工作目录相关的路径,这与脚本目录不同,尽管它们有时可能具有相同的值。 - The Elemental of Destruction
如果脚本从其当前位置以外的地方调用,例如从父文件夹中调用,则此操作将失败。 - Marc Compere
@MarcCompere 不会的。filename 的值可能不同,但一旦你使用了 os.path.abspath(),你将获得该文件的绝对路径,无论你从哪里调用它。 - Lucas Azevedo

16
今天你还可以使用基于path.pyunipath包:http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>

我建议使用这个包,因为它提供了一个干净的界面来处理常见的操作系统实用程序。

10
您可以使用此方法获取特定文件的绝对路径。
from pathlib import Path

fpath = Path('myfile.txt').absolute()

print(fpath)

这个答案已经在2018年被Mad Physicist详细解释过了。 - Martin Thoma

3

如何在 Python 中找到文件的绝对路径相对于当前工作目录,例如“mydir / myfile.txt”的路径?

我会像这样做:

import os.path
os.path.join( os.getcwd(), 'mydir/myfile.txt' )

这将返回'/home/ecarroll/mydir/myfile.txt'


2

如果您使用的是 Mac

import os
upload_folder = os.path.abspath("static/img/users")

这将为您提供完整的路径:
print(upload_folder)

将显示以下路径:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

5
除了迟了10年以外,这个答案与被接受的答案完全相同。 - wim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接