我正在研究类似于“在内存类Linux文件系统”中的简单类,用于教育目的。文件将作为StringIO对象。我无法决定如何在Python中实现文件夹层次结构类型。我正在考虑使用带有字段的对象列表:type,name,parent还有什么?也许我应该寻找树木和图表。
将会有以下方法:
NEW_DIR(路径), dir_list(路径), is_file(路径), is_dir(path),删除(路径), 读(file_descr), file_descr open(file_path,mode = w | r), 关闭(file_descr), write(file_descr,str)
答案 0 :(得分:1)
您可以尝试使用networkx。您只需要通过直观来适应它以使用文件和文件夹。
一个简单的例子
import os,networkx as nx
G=nx.Graph()
for (path, dirs, files) in os.walk(os.getcwd()):
bname = os.path.split(path)
for f in files:
G.add_edge(bname,f)
# Now do what ever you want with the Graph
答案 1 :(得分:1)
将树表示为嵌套列表是完全可能的。但是,由于条目通常按名称编制索引,并且目录通常被认为是无序的,因此嵌套字典会使许多操作更快更容易编写。
我不会为每个条目存储父级,这是从它在层次结构中的位置隐含的。
此外,如果您希望虚拟文件系统有效地支持hard links,则需要将文件内容与目录层次结构分开。这样,您可以通过为每个内容提供任意数量的名称来重复使用内容,这就是硬链接所做的。
答案 2 :(得分:0)
您首先应该问一个问题:我的"文件系统应该采取什么操作?支持?
根据答案,您可以选择数据表示。
例如,如果您选择仅支持create
和delete
并且字典中文件的顺序不重要,则选择python字典。字典会将文件名(子路径名)映射到字典或文件容器对象。
答案 3 :(得分:0)
文件存储的API是什么?您想继续创建,修改和访问时间吗?据推测,主查找将按文件名进行。是否有任何其他检索操作?
如果只需要按名称查找,那么一种可能的表示是将文件存储根目录映射到Python dict。每个条目的密钥都是文件名,并且该值将是一个StringIO对象(提示:在Python 2中使用cStringIO以获得更好的性能,如果它成为一个问题)或另一个字典。 StringIO对象代表您的文件,dicts代表子目录。
因此,要访问任何路径,请将其拆分为其组成组件(使用.split("/")
),然后使用每个路径查找连续的元素。任何KeyError异常都意味着“找不到文件或目录”,任何索引StringIO对象的尝试都是如此(我懒得验证特定的异常)。
如果要实现更多细节,那么您将使用某些“filestore object”类的实例替换StringIO对象和dicts。你可以把它称为“链接”(因为它是它的模型:Linux硬链接)。可以轻松地操作此对象的各种属性以使文件属性保持最新,.data
属性可以像以前一样是StringIO对象或dict。
总的来说,我更喜欢第二种解决方案,从那以后很容易实现一些方法,通过在执行操作时更新它们来保持访问时间是最新的,但正如我所说,很大程度上取决于你想要的详细程度提供。