簡體   English   中英

如何使用 python 創建 json 格式的文件夾樹?

[英]How can I create a folder tree in json format using python?

我想知道,如果可能的話,提供一個文件夾路徑並讓 python 腳本掃描給定的文件夾並返回一個 json 樹,其中包含每個文件夾的文件數量。 樹應包含每個子文件夾:

例如結果:

[{
  foldername: "folder1",
  amount_of_files: 123,
  children: [
    {
      foldername: "folder1.1",
      amount_of_files: 3,
      children: []
    },
    {
      foldername: "folder1.2",
      amount_of_files: 5,
      children: [
        {
          foldername: "folder1.2.1",
          amount_of_files: 20,
          children: []
        }
      ]
    }
  ]
},
{
  foldername: "folder2",
  amount_of_files: 1,
  children: [
    {
      foldername: "folder2.1",
      amount_of_files: 3,
      children: [
        {
          foldername: "folder2.1.1",
          amount_of_files: 2,
          children: [
            {
              foldername: "folder2.1.1.1",
              amount_of_files: 24,
              children: []
            }
          ]
        }
      ]
    },
    {
      foldername: "folder1.2",
      amount_of_files: 5,
      children: []
    }
  ]
}
]

您可以將os.listdir與遞歸一起使用:

import os, json
def get_tree(path=os.getcwd()):
   return {'foldername':path, 
           'amount_of_files':sum(not os.path.isdir(os.path.join(path, k)) for k in os.listdir(path)),
           'children':[get_tree(os.path.join(path, k)) for k in os.listdir(path) if os.path.isdir(os.path.join(path, k))]}


with open('folder_tree.json', 'w') as f:
   json.dump(get_tree(), f)

要生成字典列表,每個字典包含文件夾名稱和文件數,您可以使用遞歸生成器 function:

def get_tree(path=os.getcwd()):
   yield {'foldername':path, 'amount_of_files':sum(not os.path.isdir(os.path.join(path, k)) for k in os.listdir(path))}
   for i in os.listdir(path):
      if os.path.isdir(os.path.join(path, i)):
         yield from get_tree(os.path.join(path, i))

with open('folder_tree.json', 'w') as f:
   json.dump(list(get_tree()), f)

這似乎可以完成這項工作:

from os import listdir
from os.path import isdir, isfile, basename, join
from json import dumps

def folder(d):
    result = dict(
            amount_of_files=0,
            foldername=basename(d)
            )
    for each in listdir(d):
        path = join(d, each)
        if isdir(path):
            if 'children' not in result:
                result['children'] = list()
            result['children'].append(folder(path))
        if isfile(path):
            result['amount_of_files'] += 1
    return result

print(dumps(folder('.')))    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM