2011-12-15 2 views
2

以下のクラスは、Anuragによるディレクトリウォーカーを生成する動的属性です。ディレクトリListerクラスのReadline機能

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 

ちょうど下のクラスでそれを組み込む方法を知る必要があります。ありがとうございました。

答えて

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に変更したことに注意してください。これは、常にファイルのリストを表すとは限りません。

+0

私は得る... TypeError:Unicodeに強制する:必要な文字列またはバッファ、NoneTypeが見つかりました。何かf = File(self.data)で間違っていますが、私はf = File(self._data)を試みましたが、運はありません。 – Neeran

+0

また、返されたリストを反復処理できるように、このiterableを作成する方法もあります。ありがとうございました。 – Neeran

関連する問題