当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Python中获取绝对文件路径》经验,为你挑选了7个好方法。

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

"C:/example/cwd/mydir/myfile.txt"

sherbang.. 948

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

@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认同)


twasbrillig.. 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'

或者在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



1> sherbang..:
>>> 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'


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

2> twasbrillig..:

您可以使用新的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'

或者在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


很有帮助.使用`os.path.abspath()`给了我一个错误:`AttributeError:'NoneType'对象没有属性'startswith'`,使用`Path().resolve()`没有相同的相对文件路径.(Linux和Python3.4)

3> Will Harris..:
>>> import os
>>> os.path.abspath('mydir/myfile.txt')
'C:\\example\\cwd\\mydir\\myfile.txt'
>>> 



4> Tom..:

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

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


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

5> Rudolf Olah..:

今天你也可以使用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
>>>

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



6> Mad Physicis..:

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



7> benjimin..:
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有