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


Answers:


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

29
注意:在大多数平台上,这等效于normpath()按如下方式调用该函数:normpath(join(os.getcwd(), path))。因此,如果mydir/myfile.txt不根据os.getcwd(),绝对路径不是真实路径
coanor 2014年

32
@coanor?如果没有显式根,则mydir/myfile.txt隐式引用当前工作目录内的路径,因此等效于./mydir/myfile.txt。那可能不是您打算输入的路径,但是据我所知,这似乎是对路径的正确解释。你能详细说明吗?
jpmc26 2015年

2
@ jpmc26我并不完全遵循coanor,但我要说的是(与我的假设相反),该abspath函数的参数与实际文件之间没有链接。您可以提供任何路径名-不存在的文件和目录层次结构都很好-并且abspath只会解析路径的位(包括父目录“ ..”元素)并返回一个字符串。这只是从当前目录计算出的字符串;似乎与实际文件的任何关联都是偶然的。尝试os.path.abspath("/wow/junk/../blha/hooey")。有用。
Mike S

2
@MikeS我真的不知道为什么这会是意外行为。它是绝对路径,而不是绝对文件或目录。如果要检查存在性,请致电os.path.exists。相反,像PowerShell这样坚持使用标准路径解析功能的现有路径的系统很难使用。
jpmc26

1
@ jpmc26假设路径只是一个看起来像路径名的字符串,这一点都不明确,这与我多年来一直在思考和谈论路径名的方式背道而驰。我引用abspath的Python 3文档:“返回路径名path的归一化绝对化版本。” 不是“ ... 字符串 路径的版本”。根据Posix的定义,路径名是“用于标识文件的字符串”。Python文档明确指出relpath:“未访问文件系统以确认是否存在或性质。path” 如果这里的论点很明显,为什么要明确relpath
Mike S

77

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


4
非常有帮助。使用os.path.abspath()给了我一个错误:AttributeError: 'NoneType' object has no attribute 'startswith'使用Path().resolve()不具有相同的相对文件路径。(Linux和Python3.4)
NuclearPeon

23

更好的是,安装模块(位于上PyPI),它将所有os.path功能和其他相关功能包装到对象上的方法中,无论使用什么字符串,都可以使用该方法:

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

2
不幸的是,他们从来没有在stdlib中安装适当的文件名抽象模块。
Torsten Marek

1
@Torsten Marek:这是一个长期的痛苦遗漏。

4
他们现在为Python 3.4做过:pathlib。看到我在这个线程的答案。
twasbrillig 2014年

这个答案中有yypos。from path import Path然后应该是Path('mydir/myfile.txt').abspath()
frakman1

没有错别字,您可能正在使用其他path模块。链接的模块使用名为的类path
汤姆


10

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

9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

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


6

始终获取当前脚本的文件名权,即使它是从另一个脚本中调用。使用时特别有用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'

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


这不是被要求的。他们询问有关当前工作目录的路径,尽管有时它们最终可能具有相同的值,但该路径与脚本目录不同。
创作的元素

3

模块os提供了一种找到Abs路径的方法。

但是,Linux中的大多数路径都以~(波浪号)开头,因此效果不理想。

因此您可以使用srblib它。

>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'

使用安装 python3 -m pip install srblib

https://pypi.org/project/srblib/


1

我更喜欢使用glob

以下是列出当前文件夹中所有文件类型的方法:

import glob
for x in glob.glob():
    print(x)

以下是列出当前文件夹中所有(例如).txt文件的方法:

import glob
for x in glob.glob('*.txt'):
    print(x)

以下是列出所选目录中所有文件类型的方法:

import glob
for x in glob.glob('C:/example/hi/hello/'):
    print(x)

希望这对你有帮助


2
您似乎在回答另一个问题。不是“我如何获得路径?”,而是“绝对路径”。可以将正确的答案(os.path.abspath()glob应用于您
遇到的

1

如果您使用的是Mac

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

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

print(upload_folder)

将显示以下路径:

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

1

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

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.