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

如何在Python中获取绝对文件路径,python,path,relative-path,absolute-path,Python,Path,Relative Path,Absolute Path,给定一个路径,例如“mydir/myfile.txt”,如何在Python中找到文件相对于当前工作目录的绝对路径?例如,在Windows上,我可能会得到: "C:/example/cwd/mydir/myfile.txt" 如果它已经是绝对路径,也可以使用: >>> import os >>> os.path.abspath("C:/example/cwd/mydir/myfile.txt") 'C:/example/cwd/mydir/myfile.txt

给定一个路径,例如
“mydir/myfile.txt”
,如何在Python中找到文件相对于当前工作目录的绝对路径?例如,在Windows上,我可能会得到:

"C:/example/cwd/mydir/myfile.txt"
如果它已经是绝对路径,也可以使用:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
安装第三方(可在上找到),它将所有
os.path
函数和其他相关函数包装到对象上的方法中,可在使用字符串的任何位置使用:

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

现在,您还可以使用基于
path.py
unipath
包:


我建议使用它提供的这个包。

您可以使用新的Python 3.4库
pathlib
。(您也可以使用
pip install pathlib
在Python2.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'
文档在这里:

如果您使用的是mac电脑

import os
upload_folder = os.path.abspath("static/img/users")
这将为您提供完整的路径:

print(upload_folder)
将显示以下路径:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

如果有人正在使用python和linux并查找文件的完整路径:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
Python 3.4+的更新实际上回答了以下问题:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object
如果您只需要一个临时字符串,请记住您可以将
Path
对象与中的所有相关函数一起使用,当然包括:


始终获取当前脚本的正确文件名,即使从另一个脚本中调用它也是如此。当使用
子流程时,它特别有用

import sys,os

filename = sys.argv[0]
从那里,您可以通过以下方式获得脚本的完整路径:

>>> os.path.abspath(filename)
'/foo/bar/script.py'
只要在目录层次结构中添加多少次,就可以轻松地导航文件夹

要获取cwd,请执行以下操作:

>>> os.path.abspath(filename+"/..")
'/foo/bar'
对于父路径:

>>> os.path.abspath(filename+"/../..")
'/foo'
通过将
“/…”
与其他文件名组合,您可以访问系统中的任何文件

import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

请注意,如果文件(或目录)名称和位置的给定表达式可能包含前导的
~/
(波浪号表示用户的主目录),则
expanduser
是必需的(在Unix上),
expandvars
负责处理任何其他环境变量(如
$home
).

太糟糕了,他们从来没有在stdlib中得到一个合适的文件名抽象模块。@Torsten Marek:这是一个令人痛心的长期遗漏。他们现在在Python 3.4:
pathlib
中做到了。在这个帖子里看到我的答案。这个答案里有yypos。它应该是来自路径导入路径的
,然后是
路径('mydir/myfile.txt')。abspath()
没有输入错误,您可能使用了不同的
路径
模块。链接模块使用名为
path
的类。注意:在大多数平台上,这相当于调用函数
normpath()
,如下所示:
normpath(join(os.getcwd(),path))
。因此,如果
mydir/myfile.txt
不在
os.getcwd()
下,则绝对路径不是实际路径。@coanor?没有显式根,
mydir/myfile.txt
隐式引用当前工作目录中的路径,因此相当于
/mydir/myfile.txt
。这可能不是您想要输入的路径,但就我所知,这似乎是对路径的正确解释。你能详细解释一下吗?@jpmc26我并不完全理解coanor,但我想说(与我的假设相反),指向
abspath
函数的参数与实际文件之间没有联系。您可以给出任何路径名-不存在的文件和目录继承人都可以-abspath只需解析路径的位(包括父目录“
”元素)并返回一个字符串。这只是从当前目录计算的字符串;与实际文件的任何关联似乎都是偶然的。试试
os.path.abspath(“/wow/junk/。/blha/hooey”)
。“这是有效的。”迈克,老实说,我不知道为什么这会是意想不到的行为。它是绝对路径,而不是绝对文件或目录。如果要进行存在性检查,请调用
os.path.exists
。相反,像PowerShell这样坚持使用标准路径解析函数存在的路径的系统使用起来很痛苦。@jpmc26假设路径只是一个看起来像路径名的字符串,这一点都不清楚,这与我多年来一直在思考和谈论的路径名背道而驰。我引用Python3文档中的abspath:“返回一个规范化的绝对版本的路径名路径”,而不是“…版本的字符串路径”。Posix定义的路径名是“用于标识文件的字符串”。Python文档明确说明了
relpath
:“访问文件系统不是为了确认
path
的存在或性质。”。如果这里的参数很明显,为什么要显式地表示
relpath
?非常有用。使用
os.path.abspath()
给了我一个错误:
AttributeError:'NoneType'对象没有属性'startswith'
,使用
path().resolve()
不具有相同的相对文件路径。(Linux和Python3.4)根据我的实验,在Windows平台上,
resolve()
仅当它能够
resolve()
文件时,才会将完整路径返回给您。但是,
os.path.abspath
会将完整路径返回给您,即使文件不存在。但是,在linux中,它总是返回绝对路径。为什么在与包一起导入的模块中单独使用
路径(\uuuu file\uuuu)
时,会给出绝对路径而不是相对路径?这不是问题所在。他们询问了与当前工作目录相关的路径,该路径与脚本目录不同,尽管它们有时可能最终具有相同的值。与公认的答案相同,只是晚了10年。
>>> os.path.abspath(filename+"/..")
'/foo/bar'
>>> os.path.abspath(filename+"/../..")
'/foo'
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))