2017-09-25 85 views
0

我想将目录结构存储在嵌套字典中。 目录在python嵌套字典中存储目录结构

├── dirA 
│   ├── dirB1 
│   │   └── file1.txt 
│   └── dirB2 
│    └── file2.txt 
├── templates 
│   ├── base.html 
│   └── report.html 
└── test.py 

嵌套的字典树是这样的:

{'dirs': {'.': {'dirs': {'dirA': {'dirs': {'dirB1': {'dirs': {}, 
                'files': ['file1.txt']}, 
              'dirB2': {'dirs': {}, 
                'files':['file2.txt']} 
                }           
            'files': []}, 
         'templates':{'dirs':{}, 
            'files':['base.html', 'report.html']}}, 
     'files': ['test.py']}}, 
'files': []} 

我认为递归是做到这一点的好办法。

import os             
import pprint    

pp = pprint.PrettyPrinter() 
def path_to_dict(path): 
    d = {'dirs':{},'files':[]} 
    name = os.path.basename(path) 
    if os.path.isdir(path): 
     if name not in d['dirs']: 
      d['dirs'][name] = {'dirs':{},'files':[]} 
     for x in os.listdir(path): 
      d['dirs'][name]= path_to_dict(os.path.join(path,x))             
    else:     
     d['files'].append(name)   
    return d    

mydict = path_to_dict('.') 
pp.pprint(mydict) 

结果与我的预期不同。但我不知道递归中哪一步出错。

+0

我知道为什么这段代码输出错误的结果。 'd = {'dirs':{},'files':[]}'将重置字典项目。 – l0o0

+1

你为什么需要这个?在遍历目录结构时,os.walk()通常更容易处理。 –

+0

@MartinEvans是的,'os.walk()'可以通过目录。但是我正试图改变目录结构。 – l0o0

回答

1

你正在创建每次通话的dict对象,你需要做的是通过在每次调用其d['dirs'][name]值,以允许其递归构造:

import os 
import pprint 

pp = pprint.PrettyPrinter() 

def path_to_dict(path, d): 

    name = os.path.basename(path) 

    if os.path.isdir(path): 
     if name not in d['dirs']: 
      d['dirs'][name] = {'dirs':{},'files':[]} 
     for x in os.listdir(path): 
      path_to_dict(os.path.join(path,x), d['dirs'][name]) 
    else: 
     d['files'].append(name) 
    return d 


mydict = path_to_dict('.', d = {'dirs':{},'files':[]}) 

pp.pprint(mydict)