Directory Lister类中的Readline功能

时间:2011-12-15 17:39:31

标签: python file attributes instances os.walk

以下类是Anurag生成目录漫游器的动态属性。

import os

class DirLister(object):
    def __init__(self, root):
        self.root = root
        self._list = None

    def __getattr__(self, name):
        try:
            var = super(DirLister).__getattr__(self, name)
            return var
        except AttributeError:
            return DirLister(os.path.join(self.root, name))

    def __str__(self):
        self._load()
        return str(self._list)

    def _load(self):
        """
        load once when needed
        """
        if self._list is not None:
            return
        self._list = os.listdir(self.root) # list root someway

root = DirLister("/")
print root.etc.apache

有没有办法通过上面的Anurag将其他复杂功能添加到DirLister?所以当它到达一个文件时说testdir / j / p时,会打印出文件p的第一行。

[IN] print testdir.j.p
[OUT] First Line of p

我已经创建了一个用于打印文件第一行的类:

class File:
    def __init__(self, path):
        """Read the first line in desired path"""
        self.path = path
        f = open(path, 'r')
        self.first_line = f.readline()
        f.close()

    def __repr__(self):
        """Display the first line"""
        return self.first_line

只需要知道如何将它合并到下面的课程中。谢谢。

1 个答案:

答案 0 :(得分:2)

您应该可以通过检查self.root_load()中的文件还是目录来完成此操作。如果它是文件,请读取第一行,如果是目录,则执行os.listdir()。请尝试以下方法:

import os

class DirLister(object):
    def __init__(self, root):
        self.root = root
        self._data = None

    def __getattr__(self, name):
        try:
            var = super(DirLister).__getattr__(self, name)
            return var
        except AttributeError:
            return DirLister(os.path.join(self.root, name))

    def __str__(self):
        self._load()
        return str(self._data)

    def _load(self):
        """
        load once when needed
        """
        if self._data is not None:
            return
        if os.path.isfile(self.root):
            f = File(self.data)
            self._data = f.first_line
        else:
            self._data = os.listdir(self.root) # list root someway

我使用了您的File类,但您也可以将代码放在_load()中获取第一行,而不是使用单独的类来执行此操作。请注意,我还将_list重命名为_data,因为它不再总是代表文件列表。