给定一个路径,如 "mydir/myfile.txt"
,我如何在 Python 中找到文件的绝对路径?例如在 Windows 上,我可能会得到:
"C:/example/cwd/mydir/myfile.txt"
>>> 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
。 (您也可以使用 pip install pathlib
为 Python 2.6 或 2.7 获取它。)作者 wrote:“这个库的目的是提供一个简单的类层次结构来处理文件系统路径和用户对其执行的常见操作。 "
在 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' object has no attribute 'startswith'
,使用 Path().resolve()
不具有相同的相对文件路径。 (Linux 和 Python3.4)
resolve()
仅当它能够 resolve()
文件时才返回完整路径给您。但是,即使文件不存在,os.path.abspath
也会返回完整路径给您。但是,在linux中,它总是返回绝对路径
Path(__file__)
(没有解析方法)时,会给出绝对路径而不是相对路径?
resolve()
将遵循符号链接。如果您不想这样做,请改用 absolute()
,这将导致无法解析符号链接。
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
请注意,如果文件(或目录)名称和位置的给定表达式可能包含前导 ~/
(波浪号指用户的主目录),则 expanduser
是必需的(在 Unix 上),并且 expandvars
需要注意任何其他环境变量(如 $HOME
)。
安装第三方 path module(在 PyPI
上找到),它将所有 os.path
函数和其他相关函数包装到对象上的方法中,可以在使用字符串的任何地方使用:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
pathlib
。在这个线程中查看我的答案。
from path import Path
然后是 Path('mydir/myfile.txt').abspath()
path
模块。链接模块使用名为 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
今天,您还可以使用基于 path.py
的 unipath
包: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
>>>
我建议使用此软件包,因为它提供 a clean interface to common os.path utilities。
这总是获取当前脚本的正确文件名,即使它是从另一个脚本中调用的。它在使用 subprocess
时特别有用。
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'
通过将 "/.."
与其他文件名组合,您可以访问系统中的任何文件。
您可以使用它来获取特定文件的绝对路径。
from pathlib import Path
fpath = Path('myfile.txt').absolute()
print(fpath)
如果你在 Mac 上
import os
upload_folder = os.path.abspath("static/img/users")
这将为您提供完整的路径:
print(upload_folder)
将显示以下路径:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user
给定一个路径,如 mydir/myfile.txt,如何在 Python 中找到文件相对于当前工作目录的绝对路径?
我会这样做,
import os.path
os.path.join( os.getcwd(), 'mydir/myfile.txt' )
返回 '/home/ecarroll/mydir/myfile.txt'
如果有人使用 python 和 linux 并寻找文件的完整路径:
>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
不定期副业成功案例分享
normpath()
,如下所示:normpath(join(os.getcwd(), path))
。因此,如果mydir/myfile.txt
不在os.getcwd()
之下,则绝对路径不是真实路径。mydir/myfile.txt
会隐式引用当前工作目录内的路径,因此等同于./mydir/myfile.txt
。这可能不是您打算输入的路径,但据我所知,这似乎是对路径的正确解释。你能详细说明一下吗?abspath
函数的参数与真实文件之间没有联系。您可以提供任何路径名——不存在的文件和目录层次结构很好——abspath 将简单地解析路径的位(包括父目录“..
”元素)并返回一个字符串。这只是从当前目录计算的字符串;似乎与实际文件的任何关联都是偶然的。试试os.path.abspath("/wow/junk/../blha/hooey")
。有用。os.path.exists
。相反,像 PowerShell 这样坚持使用标准路径解析功能存在的路径的系统使用起来很痛苦。relpath
:“未访问文件系统以确认path
的存在或性质”。如果这里的论点很明显,为什么要明确表示relpath
?