我正在尝试创建一个遍历目录的walker。以下是我部分工作的输入和输出。我正在使用一个测试目录,但我想这是做在任何目录,这是导致一些问题。在
[IN]: print testdir #name of the directory
[OUT]: ['j','k','l'] #directories under testdir
[IN]: print testdir.j
[OUT]: ['m','n'] # Files under testdir.j
以下是目前为止的代码:
^{pr2}$这将返回目录和文件,但我必须手动分配目录的名称。在
testdir = directory_lister(path/to/testdir)
j = directory_lister(path/to/j)
etc
是否有一种自动化实例的方法,以便:
for root,dirs,files in os.walk(/path/to/testdir/):
for x in dirs:
x = directory_lister(root) #I want j = directory_lister(path/to/j), k = directory_lister(path/to/k) and l = directory_lister(path/to/l) here.
是否有:
class directory_lister:
def __init__(self,path):
self.path = path
self.j = directory_lister(path + os.sep + j) # how to automate this attribute of the class when assigned to an instance??
上面的代码是错误的,因为对象x只是一个实例,而j,k,l必须手动定义。我是否必须使用另一个类或带有getattr的字典,但我总是遇到相同的问题。如果需要额外的信息,请询问,我希望我能说清楚。在
更新2
有没有办法通过下面的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
只需要知道如何把它融入下面的课堂。谢谢您。在
不知道你在问什么,但这行吗?在
我假设你希望subdir像属性一样可访问,你可以通过两种方式来实现
我更喜欢第二种方法,因为它很懒,更好,更容易实现
输出:
^{pr2}$你可以改进这有更好的错误检查等
代码说明:这基本上是目录的递归列表,因此
DirLister
对象列出给定根目录下的文件,如果使用虚线符号访问某个变量,它将返回一个DirLister,假设该属性是根目录下的文件夹。因此,如果我们尝试一步一步地创建DirLister
类,它将更加清晰1-一个简单的
DirLister
,它只列出它下面的文件/文件夹2-我们的简单列表器只列出一级深的文件,如果我们想在子文件夹下获取文件服务器,我们可以挂接到
__getattr__
,当使用obj.varname
时,这个函数用varname调用。所以,如果dir-lister没有名为varname的属性,我们假设用户试图访问给定根目录下的目录,那么我们创建另一个DirLister,它的根是root+subdirname
注意:首先我们检查该属性的基类,因为我们不想将所有变量访问都视为sub dir访问,如果没有这样的属性,因此
AttributeError
,那么我们为sub folder创建一个新的DirLister。在3-为了改进代码,即使用户没有要求,我们也不会列出所有文件夹,我们只在用户需要时列出,因此使用了
load
方法因此,如果还没有列出,这个方法将列出dir,当我们最终需要它时,例如在打印列表时,应该调用它
编辑:正如OP所要求的,这里是递归列出整棵树的替代方法,尽管我强烈建议不要使用它
输出:
相关问题 更多 >
编程相关推荐