给定一个路径"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
>>> 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'
您可以使用新的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
>>> import os >>> os.path.abspath('mydir/myfile.txt') 'C:\\example\\cwd\\mydir\\myfile.txt' >>>
更好的是,安装PyPI
模块,它将所有os.path
函数和其他相关函数包装到一个对象的方法中,该对象可以在任何使用字符串的地方使用:
>>> from path import path >>> path('mydir/myfile.txt').abspath() 'C:\\example\\cwd\\mydir\\myfile.txt' >>>
今天你也可以使用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实用程序提供了一个干净的接口.
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
import os os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
请注意expanduser
(在Unix上),如果给定的文件(或目录)名称和位置表达式可能包含前导~/
(代字号指向用户的主目录),并且expandvars
需要处理任何其他环境变量(如$HOME
),则这是必需的。