SoulisProgrammer 2021-03-13 21:37 采纳率: 40%
浏览 245
已采纳

如何用python中怎么把文件目录输出为字典

 现在有一个文件目录如下:

path = r'D:\test'

cmd --> tree D:\test /f

D:\TEST
├─1
│  ├─1
│  │      1.txt
│  │      2.txt
│  │      3.txt
│  │
│  ├─2
│  └─3
│          1.bmp
│
├─2
│      1.docx
│
└─3

现在就是想用python递归文件夹,将这个文件目录转为dict类型,如下:

path_dict = {'D:\\test\\1': {'D:\\test\\1\\1': ['D:\\test\\1\\1\\1.txt','D:\\test\\1\\1\\2.txt','D:\\test\\1\\1\\3.txt',],'D:\\test\\1\\2': [],'D:\\test\\1\\3': ['D:\\test\\1\\3\\1.bmp'],},'D:\\test\\2': ['D:\\test\\2\\1.docx'],'D:\\test\\3': []} 
from pathlib import Path


result = []
def scan_file(path):
    result = {}
    dirList = [str(x) for x in Path(path).iterdir() if x.is_dir()]
    for v in dirList:
        # Path('.').glob('*.jpg') 不使用递归
        result[v] = [str(i) for i in Path(v).glob('**/*.*')]
    return result

上面的代码虽然可以做到,但目录下的空文件夹不见了,想尽可能让下面树形输出的目录跟文件资源管理器看到的一样

 

并且可以用以下代码:

print(json.dumps(path_dict, indent=4, ensure_ascii=False))

path_dict输出成:

{
    'D:\\test\\1': {
        'D:\\test\\1\\1': [
            'D:\\test\\1\\1\\1.txt',
            'D:\\test\\1\\1\\2.txt',
            'D:\\test\\1\\1\\3.txt',
        ],
        'D:\\test\\1\\2': [],
        'D:\\test\\1\\3': [
            'D:\\test\\1\\3\\1.bmp'
        ],
    },
    'D:\\test\\2': [
        'D:\\test\\2\\1.docx'
    ],
    'D:\\test\\3': []
}

谢谢了。

  • 写回答

1条回答 默认 最新

  • 幻灰龙 2021-03-14 09:58
    关注

    如果不用 os.walk, 用你的代码的方式,可以这样,list 和 dict 的互相嵌套导致 file 和 dir 的表示结构稍微有点不同,当然也可以让 file 的表示不只是用 string ,也用 dict 来携带更多信息,这取决于你的需求:

    from pathlib import Path
    import os
    import json 
    
    def scan_file(path):
        items = Path(path).iterdir()
        subFiles = []
        subDirs = {}
        for item in items:
            v = str(item)
            if item.is_dir():
                subResult = scan_file(item)
                subDirs[v] = subResult
            else:
                subFiles.append(v)
        if len(subDirs)>0:
            subFiles.append(subDirs)
        return subFiles
        
    result = scan_file(".")
    print(print(json.dumps(result, indent=4, ensure_ascii=False)))
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料