【问题标题】:Extract a part of the filepath (a directory) in Python在 Python 中提取文件路径(一个目录)的一部分
【发布时间】:2012-04-26 07:34:09
【问题描述】:

我需要提取某个路径的父目录名。这是它的样子:

C:\stuff\directory_i_need\subdir\file.jpg

我想提取directory_i_need

【问题讨论】:

标签: python directory filepath


【解决方案1】:
import os
## first file in current dir (with full path)
file = os.path.join(os.getcwd(), os.listdir(os.getcwd())[0])
file
os.path.dirname(file) ## directory of file
os.path.dirname(os.path.dirname(file)) ## directory of directory of file
...

您可以根据需要继续执行此操作多次...

编辑:来自os.path,您可以使用 os.path.split 或 os.path.basename:

dir = os.path.dirname(os.path.dirname(file)) ## dir of dir of file
## once you're at the directory level you want, with the desired directory as the final path node:
dirname1 = os.path.basename(dir) 
dirname2 = os.path.split(dir)[1] ## if you look at the documentation, this is exactly what os.path.basename does.

【讨论】:

  • 它确实提取了部分路径 - 但我不知道如何从路径中提取实际的目录名称。
  • +1:os.path.dirname(path)pathlib.Path(path).parent 相比更方便的场景:给你一个字符串path。您想创建path目录,如果它不存在,path 本身是否是一个目录。例如,path 可以是 /home/me/directory_to_create/file_to_create.txt/home/me/directory_to_create/。在第二种情况下,pathlib.Path(path).parent 返回了不需要的 /home/me/
【解决方案2】:

对于 Python 3.4+,请尝试pathlib module

>>> from pathlib import Path

>>> p = Path('C:\\Program Files\\Internet Explorer\\iexplore.exe')

>>> str(p.parent)
'C:\\Program Files\\Internet Explorer'

>>> p.name
'iexplore.exe'

>>> p.suffix
'.exe'

>>> p.parts
('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')

>>> p.relative_to('C:\\Program Files')
WindowsPath('Internet Explorer/iexplore.exe')

>>> p.exists()
True

【讨论】:

  • API 的精彩演示
  • 这也被向后移植到旧版本的 Python:pathlib2
  • 如果您的路径包含例如 \a,则您的示例是错误的。您应该在路径字符串前面添加 r。
【解决方案3】:

如果您使用pathlib,您只需要parent 部分。

from pathlib import Path
p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parent) 

将输出:

C:\Program Files\Internet Explorer    

如果您需要所有部分(已在其他答案中介绍),请使用parts

p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parts) 

然后你会得到一个列表:

('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')

节省时间。

【讨论】:

    【解决方案4】:

    首先,查看splitunc() 是否在os.path 中作为可用函数。返回的第一项应该是您想要的...但是我在Linux上,当我导入os并尝试使用它时,我没有这个功能。

    否则,完成工作的一种半丑陋的方式是使用:

    >>> pathname = "\\C:\\mystuff\\project\\file.py"
    >>> pathname
    '\\C:\\mystuff\\project\\file.py'
    >>> print pathname
    \C:\mystuff\project\file.py
    >>> "\\".join(pathname.split('\\')[:-2])
    '\\C:\\mystuff'
    >>> "\\".join(pathname.split('\\')[:-1])
    '\\C:\\mystuff\\project'
    

    显示检索文件正上方的目录,以及正上方的目录。

    【讨论】:

    • 我编辑了我的条目以显示 rsplit 的使用,它按照您的建议 - 但仍然给我路径而不仅仅是目录名称。
    • 我仍然不清楚你在问什么。那你为什么不把 \\ 的下一个更高实例的左边的所有东西都去掉呢?假装想要路径,然后在将其拆分为 \\.这应该可行,不是吗?
    • 我最终分道扬镳,拿走了我想要的那块,之前没有用,但在阅读了所有这些答案后,我发现我做错了什么。
    • 如果阅读答案确实对您有所帮助,请考虑至少对它们进行投票,并可能接受其中之一。不过,我很高兴您发现了错误。
    • 我喜欢这种半丑陋的方式。我通过一个简单的 os.sep 更改“\\”,它可以完美地检索路径的一小部分。
    【解决方案5】:
    import os
    
    directory = os.path.abspath('\\') # root directory
    print(directory) # e.g. 'C:\'
    
    directory = os.path.abspath('.') # current directory
    print(directory) # e.g. 'C:\Users\User\Desktop'
    
    parent_directory, directory_name = os.path.split(directory)
    print(directory_name) # e.g. 'Desktop'
    parent_parent_directory, parent_directory_name = os.path.split(parent_directory)
    print(parent_directory_name) # e.g. 'User'
    

    这也应该可以解决问题。

    【讨论】:

      【解决方案6】:

      这是我提取目录部分的操作:

      for path in file_list:
        directories = path.rsplit('\\')
        directories.reverse()
        line_replace_add_directory = line_replace+directories[2]
      

      感谢您的帮助。

      【讨论】:

        【解决方案7】:

        您必须将整个路径作为参数放入 os.path.split。见The docs。它不像字符串拆分那样工作。

        【讨论】:

        • 这不适用于 Windows 上的 UNC 类型路径名,因为 os.path 的 Python 文档状态。
        猜你喜欢
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多