【问题标题】:How to get an absolute file path in Python如何在 Python 中获取绝对文件路径
【发布时间】:2010-09-08 06:26:00
【问题描述】:

给定一个路径,例如"mydir/myfile.txt",如何在 Python 中找到文件相对于当前工作目录的绝对路径?例如。在 Windows 上,我可能会得到:

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

【问题讨论】:

    标签: python path relative-path absolute-path


    【解决方案1】:
    >>> 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
    【解决方案2】:

    您可以使用新的 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)
    • 根据我的实验,在window平台下,resolve()只有在能够resolve()文件的情况下才会返回完整路径给你。但是,os.path.abspath 无论如何都会向您返回完整路径,即使该文件不存在。但是,在linux中,它总是返回绝对路径
    • 为什么当 Path(__file__) 单独(没有 resolve 方法)用于与包一起导入的模块中时,会给出绝对路径而不是相对路径?
    • 请注意,resolve() 将跟随符号链接。如果您不想这样做,请改用absolute(),这将导致无法解析符号链接。
    【解决方案3】:

    安装第三方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的类。
    【解决方案4】:
    import os
    os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
    

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

    【讨论】:

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

    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
    

    【讨论】:

      【解决方案6】:

      今天你也可以使用基于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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

        • 这不是被问到的。他们询问了与当前工作目录相关的路径,这与脚本目录不同,尽管有时它们最终可能具有相同的值。
        【解决方案8】:

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

        from pathlib import Path
        
        fpath = Path('myfile.txt').absolute()
        
        print(fpath)
        

        【讨论】:

        • 疯狂物理学家在 2018 年已经给出了更详细的答案。
        【解决方案9】:

        如果你在 Mac 上

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

        这会给你一个完整的路径:

        print(upload_folder)
        

        将显示以下路径:

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

        【讨论】:

        • 与接受的答案相同,但晚了 10 年。
        【解决方案10】:

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

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

        【讨论】:

          猜你喜欢
          • 2023-04-05
          • 2012-04-24
          • 1970-01-01
          • 2021-04-30
          • 1970-01-01
          • 2021-08-15
          相关资源
          最近更新 更多