【问题标题】:Hierarchically printing contents of a folder structure read from a file分层打印从文件中读取的文件夹结构的内容
【发布时间】:2019-08-07 15:56:53
【问题描述】:

我有一个包含两列 urlfolder 的 CSV 文件。我需要从 CSV 读取每一行,并最终得到某种结构(可能是字典),根据其完整文件夹路径组织每个 url。文件夹列将是Parent/Child/Subchild 格式的URL 的完整文件夹路径。然后我需要遍历这个结构并打印按文件夹组织的所有 url。

假设我的 CSV 文件中有以下条目:

url,folder
www.facebook.com, Entertainment/Social Media
www.espn.com, Entertainment/Sports
www.espndeportes.espn.com, Entertainment/Sports/Spanish
www.instagram.com, Entertainment

我期望这样的输出:

### Entertainment ###
    ### Social Media ###
        www.facebook.com
    ### Social Media ###
    ### Sports ###
        ### Spanish ###
        www.espndeportes.espn.com
        ### Spanish ###
        www.espn.com
    ### Sports ###
    www.instagram.com
### Entertainment ###

我知道如何读取 CSV 文件,只是不知道如何正确地构造数据以及如何循环访问它以得到所需的结果,请帮忙。该脚本应允许任何必要的嵌套级别。缩进并不重要。

更新

我想在名为friendly 的CSV 文件中添加第三个标题。此列的值应打印在与以“ - ”分隔的 url 相同的行:

一个新的示例 CSV 文件是:

friendly,url,folder
CUCM - North,cucm-n.acme.com,ACME/CUCM/North
CUCM - PUB,cucm-pub.acme.com,ACME/CUCM
UCCX - South,uccx-south.acme.com,ACME/UCCX/South
UCCX - North,uccx-north.acme.com,ACME/UCCX/North
UCCX - PUB,uccx-pub.acme.com,ACME/UCCX
Database,db.acme.com,ACME
CUCM - North2,cucm-n2.acme.com,ACME/CUCM/North

部分打印输出如下:

### ACME ###
### CUCM ###
CUCM - PUB - cucm-pub.acme.com
### CUCM ###
Database - db.acme.com
### ACME ###

【问题讨论】:

    标签: python-3.x loops dictionary


    【解决方案1】:

    你是对的,只需将文件读入嵌套字典,每个目录一层,然后将其打印出来。 tree_t 应该只是一个类,但这更简单。

    import csv
    from collections import defaultdict, namedtuple
    
    reader = csv.DictReader(file) # or whatever your file is
    
    node = namedtuple('node', ['subtrees', 'files'])
    tree_t = lambda: node(defaultdict(tree_t), [])
    
    tree = tree_t()
    for entry in reader:
        t_cur = tree
        for level in entry['folder'].split('/'):
            t_cur = t_cur.subtrees[level]
        t_cur.files.append('{friendly} - {url}'.format(**entry))
    
    def tree2str(tree):
        s = ''
        for name, subtree in tree.subtrees.items():
            s += ('###{name}###\n'
                  '{child}\n'
                  '###{name}###\n').format(name=name, child=tree2str(subtree))
    
        s += '\n'.join(tree.files)
    
        return s
    
    print(tree2str(tree))
    

    【讨论】:

    • 缩进有点奇怪,你能告诉我这是怎么回事吗?我用打印输出编辑了我的原始帖子。此外,请查看更新
    • 我清理了一下,希望它更清晰。不过,我不太了解您的更新,示例 csv 可能会有所帮助
    • 我已经更新了我的更新。希望现在很清楚。提前致谢。
    • 好的,也回答了更新。我只是在添加到树时格式化了该部分,因为它似乎不需要任何其他处理
    • 谢谢。我测试了代码,我收到以下错误:t_cur = t_cur.subtree[level] AttributeError: 'node' object has no attribute 'subtree' 有什么建议吗?
    猜你喜欢
    • 2023-01-12
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2019-08-03
    • 2017-08-06
    相关资源
    最近更新 更多