ChatGPT解决这个技术问题 Extra ChatGPT

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

给定一个路径,如 "mydir/myfile.txt",我如何在 Python 中找到文件的绝对路径?例如在 Windows 上,我可能会得到:

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

J
JakeD
>>> 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() 之下,则绝对路径不是真实路径
@coanor ?如果没有显式根,mydir/myfile.txt 会隐式引用当前工作目录内的路径,因此等同于 ./mydir/myfile.txt。这可能不是您打算输入的路径,但据我所知,这似乎是对路径的正确解释。你能详细说明一下吗?
@jpmc26 我不完全遵循 coanor,但我会说(与我假设的相反),abspath 函数的参数与真实文件之间没有联系。您可以提供任何路径名——不存在的文件和目录层次结构很好——abspath 将简单地解析路径的位(包括父目录“..”元素)并返回一个字符串。这只是从当前目录计算的字符串;似乎与实际文件的任何关联都是偶然的。试试 os.path.abspath("/wow/junk/../blha/hooey")。有用。
@MikeS 老实说,我不确定为什么这是出乎意料的行为。它是绝对的path,而不是绝对的文件或目录。如果您想要进行存在性检查,请调用 os.path.exists。相反,像 PowerShell 这样坚持使用标准路径解析功能存在的路径的系统使用起来很痛苦。
@jpmc26 假设路径只是一个看起来像路径名的字符串根本不清楚,这与我多年来一直在思考和谈论路径名的方式背道而驰。我为 abspath 引用 Python 3 文档:“返回路径名 path 的规范化绝对版本。”不是“...string path 的版本”。 Posix 定义的路径名是“用于标识文件的字符串”。 Python 文档明确说明了 relpath:“未访问文件系统以确认 path 的存在或性质”。如果这里的论点很明显,为什么要明确表示 relpath
M
Martijn Pieters

您可以使用新的 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(),这将导致无法解析符号链接。
b
benjimin
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

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


我知道这是一个相当古老的答案,但是没有一个命令可以在一次调用中完成所有这些吗?似乎这将使传入路径最灵活,因此经常需要(至少在我的情况下是这样)。
w
wim

安装第三方 path module(在 PyPI 上找到),它将所有 os.path 函数和其他相关函数包装到对象上的方法中,可以在使用字符串的任何地方使用:

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

太糟糕了,他们从来没有在标准库中得到一个正确的文件名抽象模块。
@Torsten Marek:这是一个令人痛心且长期存在的遗漏。
他们现在为 Python 3.4 做了:pathlib。在这个线程中查看我的答案。
这个答案中有yypos。应该是 from path import Path 然后是 Path('mydir/myfile.txt').abspath()
没有错别字,您可能使用了不同的 path 模块。链接模块使用名为 path 的类。
M
Mad Physicist

实际回答问题的 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.pyunipath 包: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


L
Lucas Azevedo

总是获取当前脚本的正确文件名,即使它是从另一个脚本中调用的。它在使用 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'

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


这不是被问到的。他们询问了与当前工作目录相关的路径,这与脚本目录不同,尽管有时它们最终可能具有相同的值。
如果从当前位置以外的某个位置(例如从父文件夹)调用脚本,这将失败。
D
Dhiaa Al-Shalabi

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

from pathlib import Path

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

print(fpath)

Mad Physicist 在 2018 年已经给出了更详细的答案。
c
chikwapuro

如果你在 Mac 上

import os
upload_folder = os.path.abspath("static/img/users")

这将为您提供完整的路径:

print(upload_folder)

将显示以下路径:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

与已接受的答案相同,但它晚了 10 年。
E
Evan Carroll

给定一个路径,如 mydir/myfile.txt,如何在 Python 中找到文件相对于当前工作目录的绝对路径?

我会这样做,

import os.path
os.path.join( os.getcwd(), 'mydir/myfile.txt' )

返回 '/home/ecarroll/mydir/myfile.txt'


B
BND

如果有人使用 python 和 linux 并寻找文件的完整路径:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file