张春成

V2

2022/08/06阅读:15主题:默认主题

文件结构树

文件结构树

现代计算机操作系统往往会用目录树的结构来维护用户的文件。

但用户面对这个树形的结构往往需要四处翻找,才能找到他想要的文件。

因此,本文尝试用交互式圆饼图展示文件结构,力图用最简洁的方式来帮助用户找到他需要的文件。


目录树结构可视化

使用 Javascript 搭建前端可视化环境,实现代码可见

Data structure of my WeChat articles[1]

它将目录结构表示成一个圆圈,圆圈上的块代表目录节点,点击这些节点可以跳转到该子目录中。

这种做法的好处是可以方便地看到这一级和下一级目录,并且目录块所占的区域面积正比于它所含有的文件数量。

因为在使用电脑的过程中,如果单纯地找某个文件可能是比较困难的,困难有条

  1. 首先,人眼对长串的目录名其实不是很敏感,分辨这些文件名称对于疲劳的打工人来说,往往是场灾难;
  2. 其次,目录中的文件往往与目录名并没有很强的偶合关系,这就导致上面的灾难其实是无用功;
  3. 再次,对于特定的文件来说,如果能够早一步看到与它相邻的文件名,那么就会提前唤醒大脑中的注意机制,它就会显得好找一些;
  4. 另外,目录的大小也对寻找文件起着重要作用,这是因为人的记忆机制往往会通过额外的信息来更高效地存储和检索特定信息。这就像是背古诗,知道前一句背后一句很容易;但知道后一句背前一句则很难;
  5. 最后,以上四条是我刚编的,完全没经过大脑,我做这个只是觉得这个方法有点好看。
Snipaste_2022-08-06_13-37-00.png
Snipaste_2022-08-06_13-37-00.png
Snipaste_2022-08-06_13-37-35.png
Snipaste_2022-08-06_13-37-35.png
Snipaste_2022-08-06_13-37-26.png
Snipaste_2022-08-06_13-37-26.png
Snipaste_2022-08-06_13-37-19.png
Snipaste_2022-08-06_13-37-19.png

目录树的遍历代码

这是一段切实可用的递归代码,它之所以出现在这里是出于 2 点考虑,

  • 首先,它有点用,至少它是能够正常(安全)工作的递归方法;
  • 其次,它没有那么有用,还不值得单独传到 GITHUB 上。
# %%
import os
import json
from pathlib import Path

# %%
# Where to dig

root_path = Path(os.environ['HOME'], 'onedrive''laptop''WritingScripts')
root_path

# %%
# Check whether the path is ignored

def _check(path):
    '''Check the [path] for its validity'''
    if path.name.startswith('.'):
        return False
    return True

def _iter(node, folder, depth):
    '''
    Iter function for digging into the folder.

    Args:
    - node: Where the results are added;
    - folder: The folder to start with;
    - depth: A number controls when the iteration stops, it stops when it down below 0.

    '''

    if depth < 0:
        return

    depth -= 1

    if not folder.is_dir():
        return

    for sub in folder.iterdir():
        if not _check(sub):
            continue

        node['children'].append(dict(name=sub.name, children=[]))

        _iter(node['children'][-1], sub, depth)

        if len(node['children'][-1]['children']) == 0:
            node['children'][-1].pop('children')
            node['children'][-1]['value'] = 1

    return

# %%
# Dig into root_folder and the results are restored into the data
data = dict(name=root_path.name, children=[])
_iter(data, root_path, depth=3)

# %%
# Save the data into data.json
json.dump(data, open('data.json''w'))

# %%

参考资料

[1]

Data structure of my WeChat articles: https://observablehq.com/@listenzcc/data-structure-of-my-wechat-articles

分类:

后端

标签:

后端

作者介绍

张春成
V2