Создание словарей для каждой подпапки - PullRequest
0 голосов
/ 17 января 2019

Я хочу создать отдельные словари для всех подпапок в основной папке.

У меня есть папка с подпапками, в которой находятся файлы .txt, из которых я выделяю «Описание» и добавляю в словарь со счетчиком.

Я могу сделать это правильно для всей папки, но не для каждой вложенной папки.

Структура подпапок выглядит следующим образом:

├───Locatie_5
│   ├───Stacked_Batch_1
│   ├───Stacked_Batch_2_Top_Bottom
│   ├───Stacked_Loc5_Hab1_05mm
│   ├───Stacked_Loc5_Hab1_1mm
│   ├───Stacked_Loc5_Hab_General_Somesinglesmissingstill
│   └───Stacked_Loc_5_Hab2_Ishetwel5niet4
├───Stacked_Half_loc_4_Hab6_Half_loc_2_4
├───Stacked_Last_Session_Rest
├───Stacked_locatie_2_4
├───Stacked_Loc4_Hab6_25mm
└───Stacked_Locatie_2

Желаемые выходные словари в идеале должны быть названы в честь папки (и, если в этом случае следует подпапка), перечислить имена таксонов макробеспозвоночных, найденные в файлах .txt папок, и количество раз, которое они встречаются, следующим образом :

  • Locatie_5_Stacked_Batch_1 = {"Anisus_vortex": "4", "Bithynia_tentaculata": "2", ...}
  • Locatie_5_Stacked_Batch_2_Top_Bottom = {"Anisus_vortex": "7", "Bithynia_tentaculata": "3", ...}
  • Stacked_Half_loc_4_Hab6_Half_loc_2_4 = {"Anisus_vortex": "0", "Bithynia_tentaculata": "25", ...}
    • и т.д ...

В приведенном ниже коде работает извлечение всех описаний из основной папки и ее подпапок, объединенных в один словарь. Я подумал, что было бы разумно, по крайней мере, сделать цикл из каталогов в строке 7 следующим шагом.
Мне также имеет смысл создать словари в цикле и оттуда получить путь к папке в виде строки и назначить это как название словаря.

Итак, я бы хотел следующее:

  • Словарь для каждой подпапки
  • В каждом словаре "Описание" плюс счетчик из этой подпапки
  • В идеале имя словаря должно быть или включать имя подпапки.

Как мне это сделать?

Дополнительное примечание: мне просто нужно получить описания и подсчеты и узнать, из каких папок они поступают, чтобы поместить их в другой файл (.txt, лист или базу данных), так что, возможно, есть другая решение, чем сначала добавить их в словарь?

import os
import re

taxa_Counts = dict()

for subdir, dirs, files in os.walk("D:/MacroInvertebrates_Stacked"):
    for dir in dirs:
        for file in files:
            #print os.path.join(subdir, file)
            filepath = subdir + os.sep + file

            if not filepath.endswith(".txt"):
                continue

            Current_File = open(filepath)
            for line in Current_File:
                line = line.rstrip()
                #print(line)
                if line.startswith("Description"):
                    taxa = line.split()[2:3]

                    #print(line)
                    #print(Taxon)
                    for taxon in taxa:
                        taxa_Counts[taxon]=taxa_Counts.get(taxon,0) +1 

print(taxa_Counts)

1 Ответ

0 голосов
/ 17 января 2019

Я внес изменения только в первую часть, так как ваша часть извлечения описания работает.

Ниже приведена реализация Python 3.Я не пробовал его, поэтому, пожалуйста, дайте мне знать, если он не работает.

import os

root_folder = r'D:/MacroInvertebrates_Stacked'
content = {}

for root, dirs, files in os.walk(root_folder):
    for subdir in dirs:
        content[os.path.join(root, subdir)] = []
    content[root] = files

list_of_dicts = []

for folder, filenames in list(content.items()):
    dict_name = string(os.path.relpath(folder, root_folder)).replace('\\', '_')
    dict_name = {}
    for filename in filenames:
        if filename.endswith('.txt'):
           with open(filename) as f:
                for line in f:
                    line = line.rstrip()
                    if line.startswith("Description"):
                        taxa = line.split()[2:3]
                        for taxon in taxa:
                            dict_name[taxon]=dict_name.get(taxon,0) +1 
    list_of_dicts.append(dict_name)

print(list_of_dicts)

list_of_dicts содержит имена словарей, соответствующие каждой подпапке с подсчетами в ней.

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