Как посчитать количество файлов в подкаталогах? - PullRequest
0 голосов
/ 31 октября 2018

У меня следующая файловая структура, и я хотел бы использовать python для создания словаря количества файлов в каждой папке. Пример внизу будет переводиться в следующий словарь:

{Employee A: {Jan : 3}, {Feb : 2}, Employee B: {Jan : 2}, {Feb : 1}}

Кто-нибудь знает, как перебрать каталог, используя os для этого?

Employee A
    Jan
        File 1
        File 2
        File 3
    Feb
        File 1
        File 2
Employee B
    Jan
        File 1
        File 2
    Feb
        File 1

Ответы [ 4 ]

0 голосов
/ 01 ноября 2018

С небольшими изменениями рецепт ActiveState Python Создать вложенный словарь из os.walk можно сделать так, как вы хотите:

try:
    reduce
except NameError:  # Python 3
    from functools import reduce
import os

def count_files_in_directories(rootdir):
    """ Creates a nested dictionary that represents the folder structure
        of rootdir with a count of files in the lower subdirectories.
    """
    dir = {}
    rootdir = rootdir.rstrip(os.sep)
    start = rootdir.rfind(os.sep) + 1
    for path, dirs, files in os.walk(rootdir):
        folders = path[start:].split(os.sep)
        subdir = len(files) if files else dict.fromkeys(files)
        parent = reduce(dict.get, folders[:-1], dir)
        parent[folders[-1]] = subdir

    return list(dir.values())[0]

startdir = "./sample"
res = count_files_in_directories(startdir)
print(res)  # -> {'Employee A': {'Feb': 2, 'Jan': 3}, 'Employee B': {'Feb': 1, 'Jan': 2}}

Обратите внимание, что каталог ./sample является корневым каталогом структуры папок, которую я создал для тестирования, точно так же, как показано в вашем вопросе.

0 голосов
/ 31 октября 2018

Изучите парсинг вывода из os.walk

Например:

mydict = {}
for (root,dirs,files) in os.walk('testdir', topdown=False)
    if len(files)>0:
        mydict[root]=len(files)
print mydict

возвращает

{'testdir/EmployeeB/Jan': 2, 'testdir/EmployeeA/Feb': 2, 'testdir/EmployeeB/Feb': 1, 'testdir/EmployeeA/Jan': 3}

Вы могли бы довольно легко разобрать эти ключи, чтобы создать вложенный словарь, который вы ищете.

0 голосов
/ 31 октября 2018

использовать библиотеку os:

import os
parent = os.listdir(path) # return directory files to list
child = []
for x in parent:
    if os.path.isdir(path +'/' + x):
        child.append(os.listdir(path + '/' + x))
    else
        child.append('')
d = dict(zip(parent,child))
print(d)

это основная логика создания словаря из каталогов. однако это поддерживает 2 уровня. Я оставлю часть n-уровня себе.

0 голосов
/ 31 октября 2018

Нечто подобное позволит вам перебрать все файлы в каталоге и создать их список. Вы можете изменить его при необходимости:

import os
import glob
from pathlib import Path

error_log_list = []

def traverse_structure():

  try:
    root = r"C:\\Users\Whatever\Desktop\DirectoryToSearch"
    # Change working directory
    os.chdir(root)

    print("Creating master list of the directory structure...\n")

    # Traverse the folder structure
    for folder, subfolders, files in os.walk(root):

      # Pass over each file
      for file in files:

        absolute_path = os.path.join(folder,file)

        # Create a master file list
        file_paths_list.append(absolute_path)

  except Exception as e:
    error_log_list.append( "Failed to open the root directory specified "+root+"\n Error: "+str(e)+"\n" )

traverse_structure()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...