假设我具有以下文件夹结构:
My Project
├── One
│ ├── Another Thing
│ └── Two
│ ├── Three
│ │ └── foo.py
│ └── Whatever
└── Something Else
从foo.py
,使用Python 2,如何获得其所有父目录的列表?它应该看起来像这样:
['My Project', 'One', 'Two', 'Three']
答案 0 :(得分:2)
当Python从磁盘上的文件中加载它们时,可以使用所有Python模块上设置的__file__
attribute来获取当前Python模块的路径。这是一个字符串,表示到模块的源文件或__main__
字节缓存文件的绝对路径或相对路径(后者通常仅在.pyc
脚本时使用)。
使用os.path
module来a)确保路径是绝对路径,b)获取所有目录名称:
import os
HERE = os.path.dirname(os.path.abspath(__file__))
def path_list(pathname):
drive, directory = os.path.splitdrive(pathname)
path = [] if not drive else [drive]
# with no UNC prefix, normpath guarantees the path uses os.sep
path += filter(None, os.path.normpath(directory).split(os.sep))
return path
在Windows上需要os.path.splitdrive()
调用,在Windows上,网络(UNC)路径可以以\\hostname\mount
或C:\\
(驱动器号)开头。上面包括这样的前缀作为第一元素。 UNC前缀拆分的另一个令人高兴的副作用是,这避免了一个极端的情况,其中os.path.normpath()
不会将os.altsep
分隔符(在Windows上是/
)替换为\
( Windows os.sep
值)(如果路径以特殊的\\?\
或\\.\
前缀开头。
演示:
>>> __file__ = os.path.join(os.sep, 'My Project', 'One', 'Two', 'Three', 'foo.py')
>>> __file__
'/My Project/One/Two/Three/foo.py'
>>> HERE = os.path.dirname(os.path.abspath(__file__))
>>> HERE
'/My Project/One/Two/Three'
>>> path_list(HERE)
['My Project', 'One', 'Two', 'Three']
在Python 3.x上,或者如果您准备安装backport,也可以使用pathlib
library;。它提供了具有Path.parts
attribute的Path
实例,该实例为您提供了完全相同的信息(其根部分由os.sep
或Windows上的驱动器号或UNC路径表示):
try:
from pathlib import Path
except ImportError:
# pathlib2 backport
from pathlib2 import Path
HERE = Path(__file__).resolve().parent
path_list = HERE.parts[1:] if HERE.root else HERE.parts
(注意:Path.parts
会生成一个元组,如果您必须有一个列表,请先将结果传递给list()
。)
您可能还对Path.parents
sequence感兴趣,它以相反的顺序为您提供了所有父目录作为Path
实例:
>>> from pathlib import Path
>>> HERE = Path(__file__).resolve().parent
>>> HERE
PosixPath('/My Project/One/Two/Three')
>>> HERE.parts[1:] if HERE.root else HERE.parts
('My Project', 'One', 'Two', 'Three')
>>> list(HERE.parents)
[PosixPath('/My Project/One/Two'), PosixPath('/My Project/One'), PosixPath('/My Project'), PosixPath('/')]
答案 1 :(得分:0)
要获取列表中的目录列表,只需获取当前工作目录并用/
进行拆分
In [6]: import os
In [7]: print os.getcwd().split(os.sep)[1:]
['home', 'rahul', 'Projects', 'Resume_parser', 'Code_base']
对于特定文件,
In [16]: print os.path.abspath('helpers.py').split(os.sep)[1:-1]
['home', 'rahul', 'Projects', 'Resume_parser', 'Code_base']