【发布时间】:2010-09-08 06:26:00
【问题描述】:
给定一个路径,例如"mydir/myfile.txt",如何在 Python 中找到文件相对于当前工作目录的绝对路径?例如。在 Windows 上,我可能会得到:
"C:/example/cwd/mydir/myfile.txt"
【问题讨论】:
标签: python path relative-path absolute-path
给定一个路径,例如"mydir/myfile.txt",如何在 Python 中找到文件相对于当前工作目录的绝对路径?例如。在 Windows 上,我可能会得到:
"C:/example/cwd/mydir/myfile.txt"
【问题讨论】:
标签: python path relative-path absolute-path
>>> 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'
【讨论】:
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?
您可以使用新的 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'
【讨论】:
os.path.abspath() 给了我一个错误:AttributeError: 'NoneType' object has no attribute 'startswith',使用Path().resolve() 不具有相同的相对文件路径。 (Linux 和 Python3.4)
resolve()只有在能够resolve()文件的情况下才会返回完整路径给你。但是,os.path.abspath 无论如何都会向您返回完整路径,即使该文件不存在。但是,在linux中,它总是返回绝对路径
Path(__file__) 单独(没有 resolve 方法)用于与包一起导入的模块中时,会给出绝对路径而不是相对路径?
resolve() 将跟随符号链接。如果您不想这样做,请改用absolute(),这将导致无法解析符号链接。
安装第三方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的类。
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
请注意,expanduser 是必需的(在 Unix 上),以防文件(或目录)名称和位置的给定表达式可能包含前导 ~/(波浪号指用户的主目录)和 @987654324 @ 负责任何其他环境变量(如$HOME)。
【讨论】:
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
【讨论】:
如果有人使用 python 和 linux 并寻找文件的完整路径:
>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
【讨论】: