使用Python爬目录树

时间:2018-07-18 10:07:21

标签: python directory python-2.x

假设我具有以下文件夹结构:

My Project
├── One
│   ├── Another Thing
│   └── Two
│       ├── Three
│       │   └── foo.py
│       └── Whatever
└── Something Else

foo.py,使用Python 2,如何获得其所有父目录的列表?它应该看起来像这样:

['My Project', 'One', 'Two', 'Three']

2 个答案:

答案 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\mountC:\\(驱动器号)开头。上面包括这样的前缀作为第一元素。 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 attributePath实例,该实例为您提供了完全相同的信息(其根部分由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']