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

izb*_*izb 653 python path relative-path absolute-path

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

"C:/example/cwd/mydir/myfile.txt"
Run Code Online (Sandbox Code Playgroud)

she*_*ang 948

>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Run Code Online (Sandbox Code Playgroud)

如果它已经是绝对路径也可以工作:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Run Code Online (Sandbox Code Playgroud)

  • @coanor?如果没有显式的根,`mydir/myfile.txt`会隐式引用当前工作目录中的路径,因此相当于`./mydir/myfile.txt`.这可能不是你打算输入的路径,但就我所知,这似乎是对路径的正确解释.你能详细说说吗? (32认同)
  • 注意:在大多数平台上,这相当于调用函数`normpath()`,如下所示:`normpath(join(os.getcwd(),path))`.因此,如果`mydir/myfile.txt`不在`os.getcwd()`下,那么绝对路径__not不是真正的路径___. (27认同)
  • @ jpmc26我没有完全遵循coanor,但是我想说(与我的假设相反),`abspath`函数的参数与实际文件之间没有链接。您可以提供任何路径名-不存在的文件和目录层次结构都很好-而abspath只会解析路径的位(包括父目录“ ..”元素)并返回一个字符串。这只是从当前目录计算出的字符串;似乎与实际文件的任何关联都是偶然的。尝试`os.path.abspath(“ / wow / junk /../ blha / hooey”)`。有用。 (2认同)
  • @MikeS我真的不知道为什么这会是意外行为。它是绝对路径,而不是绝对文件或目录。如果您想进行生存检查,请调用`os.path.exists`。相反,像PowerShell这样坚持使用标准路径解析功能的现有路径的系统很难使用。 (2认同)

twa*_*lig 70

您可以使用新的Python 3.4库pathlib.(您也可以使用它来获取Python 2.6或2.7 pip install pathlib.)作者写道:"这个库的目的是提供一个简单的类层次结构来处理文件系统路径以及用户对它们执行的常见操作."

要在Windows中获取绝对路径:

>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'
Run Code Online (Sandbox Code Playgroud)

或者在UNIX上:

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

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

  • 很有帮助.使用`os.path.abspath()`给了我一个错误:`AttributeError:'NoneType'对象没有属性'startswith'`,使用`Path().resolve()`没有相同的相对文件路径.(Linux和Python3.4) (4认同)
  • 根据我的实验,在窗口平台中,只有能够解析()文件时,`resolve()`才会返回完整路径。但是,“os.path.abspath”无论如何都会返回完整路径,即使该文件不存在。然而,在linux中,它总是返回绝对路径 (3认同)

Wil*_*ris 56

>>> import os
>>> os.path.abspath('mydir/myfile.txt')
'C:\\example\\cwd\\mydir\\myfile.txt'
>>> 
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 24

更好的是,安装PyPI模块,它将所有os.path函数和其他相关函数包装到一个对象的方法中,该对象可以在任何使用字符串的地方使用:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
Run Code Online (Sandbox Code Playgroud)

  • 他们现在为Python 3.4做了:`pathlib`.在这个帖子中查看我的答案. (4认同)
  • 太糟糕了,他们从未在stdlib中获得适当的文件名抽象模块. (2认同)

Rud*_*lah 14

今天你也可以使用unipath基于的软件包path.py: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
>>>
Run Code Online (Sandbox Code Playgroud)

我建议使用这个包,因为它为常见的os.path实用程序提供了一个干净的接口.


Luc*_*edo 11

始终获取当前脚本的正确文件名,即使它是从另一个脚本中调用的。使用subprocess.

import sys,os

filename = sys.argv[0]
Run Code Online (Sandbox Code Playgroud)

从那里,您可以获得脚本的完整路径:

>>> os.path.abspath(filename)
'/foo/bar/script.py'
Run Code Online (Sandbox Code Playgroud)

只需/..在目录层次结构中“向上”附加任意次数,它还可以更轻松地导航文件夹。

要获取 cwd:

>>> os.path.abspath(filename+"/..")
'/foo/bar'
Run Code Online (Sandbox Code Playgroud)

对于父路径:

>>> os.path.abspath(filename+"/../..")
'/foo'
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是被问到的。他们询问与当前工作目录相关的路径,该路径与脚本目录不同,尽管有时它们最终可能具有相同的值。 (2认同)

Dhi*_*abi 11

您可以使用它来获取特定文件的绝对路径。

from pathlib import Path

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

print(fpath)
Run Code Online (Sandbox Code Playgroud)


Mad*_*ist 9

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

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object
Run Code Online (Sandbox Code Playgroud)

如果只需要一个临时字符串,请记住,您可以将Path对象与中的所有相关功能一起使用os.path,当然包括abspath

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object
Run Code Online (Sandbox Code Playgroud)


ben*_*min 6

import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Run Code Online (Sandbox Code Playgroud)

请注意expanduser(在Unix上),如果给定的文件(或目录)名称和位置表达式可能包含前导~/(代字号指向用户的主目录),并且expandvars需要处理任何其他环境变量(如$HOME),则这是必需的。