Создание сложного вложенного словаря из значений, извлеченных из CSV-файла. - Python - PullRequest
1 голос
/ 23 февраля 2020

У меня есть следующие файлы:

Файлы

Мне нужно иметь возможность создать словарь и заполнить его данными из нескольких файлов CSV

Внутри каждого файла появляется следующее:

enter image description here

Итак, моя проблема в том, что мне нужно собрать все файлы в каталоге l oop через каждую строку построчно и выделите соответствующие данные в словарь, как показано на рисунке.

Вот то, что у меня есть до сих пор - мне удается через каталог * l oop и получить каждое отдельное имя файла, однако Я не уверен, как читать каждую строку построчно, анализируя данные, требуемые как I go, в словарь.

from glob import glob
import os
from os.path import basename
import csv
import numpy as np

def main():

    rts = {}

    directory = 'C:/Users/oli.warriner/Desktop/data(2)/data/'

    files = sorted(glob('C:/Users/oli.warriner/Desktop/data(2)/data/*.csv'))
    sfiles = [basename(filepath) for filepath in files]
    for f in sfiles:
        path = os.path.join(directory, f)
        singleFile = csv.DictReader(open(path, 'r'))
        for line in singleFile:
            if f not in rts:
                rts[f] = []
                if line['condition'] not in rts[f]:
                    rts[ line['condition']] = []

                rts[ line['condition']].append(float (line['rt']))

    for condition in rts.keys():
        data = np.array(rts[condition])
        m = data.mean()
        v = data.var()


if __name__ == "__main__":
    main()

Текущий вывод словаря:

{'congruent': [0.647259, 0.720116, 0.562909, 0.538918, 0.633367, 0.668142, 1.820112, 0.798532, 0.470939, ...],
'incongruent': [0.767041, 0.990185, 0.693017, 0.679368, 0.951432, 1.289047, 0.647722, 0.858307, 1.118404, ...]}

Желаемый Вывод:

results = {'PO1': 
        {'Congruent': 
            {'rt':  {0.4, 0.5, 0.8, 0.5, 0.6}},
            {'correct': {TRUE, FALSE, TRUE, TRUE, FALSE}}
        },
        {'Incongruent': 
            {'rt':  {0.4, 0.5, 0.8, 0.5, 0.6}},
            {'correct': {TRUE, FALSE, TRUE, TRUE, FALSE}}           
        }
       },
       {'PO2': 
        {'Congruent': 
            {'rt':  {0.4, 0.5, 0.8, 0.5, 0.6}},
            {'correct': {TRUE, FALSE, TRUE, TRUE, FALSE}}
        },
        {'Incongruent': 
            {'rt':  {0.4, 0.5, 0.8, 0.5, 0.6}},
            {'correct': {TRUE, FALSE, TRUE, TRUE, FALSE}}           
        }
       },
       {'PO3': 
        {'Congruent': 
            {'rt':  {0.4, 0.5, 0.8, 0.5, 0.6}},
            {'correct': {TRUE, FALSE, TRUE, TRUE, FALSE}}
        },
        {'Incongruent': 
            {'rt':  {0.4, 0.5, 0.8, 0.5, 0.6}},
            {'correct': {TRUE, FALSE, TRUE, TRUE, FALSE}}           
        }
       }

Мне нужно иметь возможность вкладывать значения rt в каждое условие и правильные значения для каждого условия. Это также необходимо разделить по файлам и сохранить в словаре.

Я буду использовать словарь для вычисления среднего значения и времени реакции stddev для каждого из условий. Любая помощь очень ценится. Если я где-то был слишком расплывчат, пожалуйста, не стесняйтесь задавать вопросы

1 Ответ

1 голос
/ 23 февраля 2020

Приведенный ниже код заполнит словарь rts ожидаемыми значениями. Я специально оставил часть numpy. Я думаю, что это не будет проблемой для вас, чтобы забрать оттуда.

Требуется Python 3.4+ из-за pathlib:

import csv
from pathlib import Path


def main():
    rts = {}

    data = Path('C:/Users/oli.warriner/Desktop/data(2)/data')

    for csvfile in data.glob('*.csv'):
        key = csvfile.stem

        with csvfile.open() as f:
            csv_reader = csv.reader(f)

            # Skip the header
            _ = next(csv_reader)

            rts[key] = {
                'congruent': {
                    'rt': [],
                    'correct': []
                },
                'incongruent': {
                    'rt': [],
                    'correct': []
                },
            }

            for tn, ctext, cname, condition, response, rt, correct in csv_reader:
                rts[key][condition]['rt'].append(float(rt))
                rts[key][condition]['correct'].append(correct)

Я надеюсь, что это поможет как отправная точка.

...