首页 > 解决方案 > 将 csv 中的 itens 复制到 pythonic dict 或 json

问题描述

我在这里做了很多搜索,寻找可以帮助我的东西,并找到了一些对初始 json 有帮助的东西。

我有一个这种格式的 csv:

STUDENT_ID,FULL_NAME,COURSE_CODE,COURSE_NAME,DISCIPLINE_NAME
1,STUDENT_ONE,GAM,GESTAO AMBIENTAL,BIOQUÍMICA AMBIENTAL
1,STUDENT_ONE,GAM,GESTAO AMBIENTAL,GEOPROCESSAMENTO APLICADO À GESTÃO AMBIENTAL
2,STUDENT_TWO,COM,COMERCIO,FUNDAMENTOS DO COMÉRCIO EXTERIOR
2,STUDENT_TWO,COM,COMERCIO,PROJETO INTEGRADOR II
2,STUDENT_TWO,COM,COMERCIO,LÍNGUA PORTUGUESA III
2,STUDENT_TWO,COM,COMERCIO,QUÍMICA II
2,STUDENT_TWO,COM,COMERCIO, FÍSICA I
2,STUDENT_TWO,COM,COMERCIO,EDUCAÇÃO FÍSICA I
2,STUDENT_TWO,COM,COMERCIO,MATEMÁTICA III
2,STUDENT_TWO,COM,COMERCIO,SOCIOLOGIA III
2,STUDENT_TWO,COM,COMERCIO,FUNDAMENTOS DE CONTABILIDADE APLICADOS AO COMÉRCIO E SERVIÇOS
2,STUDENT_TWO,COM,COMERCIO,BIOLOGIA III
2,STUDENT_TWO,COM,COMERCIO,FILOSOFIA III
3,STUDENT_THREE,TME,TEORIAS E METODOLOGIAS DA EDUCAÇÃO,TRABALHO DE CONCLUSÃO DO CURSO

我能够使用以下代码为 COD_CURSO 生成一个 json:

temp1 = {}

for student in out:
    curso = student.pop("COD_CURSO")
    if not temp1.get(curso, None):
        temp1[curso] = []
    temp1[curso].append(student)

json 如下所示:

{
  "GAM": [
    {
      "STUDENT_ID": 1,
      "FULL_NAME": "STUDENT_ONE",
      "COURSE_NAME": "GESTAO AMBIENTAL",
      "DISCIPLINE_NAME": "BIOQUÍMICA AMBIENTAL"
    },
    {
      "STUDENT_ID": 1,
      "FULL_NAME": "STUDENT_ONE",
      "COURSE_NAME": "GESTAO AMBIENTAL",
      "DISCIPLINE_NAME": "GEOPROCESSAMENTO APLICADO À GESTÃO AMBIENTAL"
    }
  ],
  "COM": [
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "FUNDAMENTOS DO COMÉRCIO EXTERIOR"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "PROJETO INTEGRADOR II"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "LÍNGUA PORTUGUESA III"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "QUÍMICA II"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": " FÍSICA I"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "EDUCAÇÃO FÍSICA I"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "MATEMÁTICA III"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "SOCIOLOGIA III"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "FUNDAMENTOS DE CONTABILIDADE APLICADOS AO COMÉRCIO E SERVIÇOS"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "BIOLOGIA III"
    },
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": "FILOSOFIA III"
    }
  ],
  "TME": [
    {
      "STUDENT_ID": 3,
      "FULL_NAME": "STUDENT_THREE",
      "COURSE_NAME": "TEORIAS E METODOLOGIAS DA EDUCAÇÃO",
      "DISCIPLINE_NAME": "TRABALHO DE CONCLUSÃO DO CURSO"
    }
  ]
}

我想将重复的学生与他们各自的学科合并,如下所示。

{
  "GAM": [
    {
      "STUDENT_ID": 1,
      "FULL_NAME": "STUDENT_ONE",
      "COURSE_NAME": "GESTAO AMBIENTAL",
      "DISCIPLINE_NAME": [
        "BIOQUÍMICA AMBIENTAL",
        "GEOPROCESSAMENTO APLICADO À GESTÃO AMBIENTAL"
      ]
    }
  ],
  "COM": [
    {
      "STUDENT_ID": 2,
      "FULL_NAME": "STUDENT_TWO",
      "COURSE_NAME": "COMERCIO",
      "DISCIPLINE_NAME": [
        "FUNDAMENTOS DO COMÉRCIO EXTERIOR",
        "PROJETO INTEGRADOR II",
        "LÍNGUA PORTUGUESA III",
        "QUÍMICA II",
        "FÍSICA I",
        "EDUCAÇÃO FÍSICA I",
        "MATEMÁTICA III",
        "SOCIOLOGIA III",
        "FUNDAMENTOS DE CONTABILIDADE APLICADOS AO COMÉRCIO E SERVIÇOS",
        "BIOLOGIA III",
        "FILOSOFIA III"
      ]
    }
  ],
  "TME": [
    {
      "STUDENT_ID": 3,
      "FULL_NAME": "STUDENT_THREE",
      "COURSE_NAME": "TEORIAS E METODOLOGIAS DA EDUCAÇÃO",
      "DISCIPLINE_NAME": "TRABALHO DE CONCLUSÃO DO CURSO"
    }
  ]
}

知道我该怎么做吗?

标签: pythonjsoncsvdictionary

解决方案


这是用 python 解决的一项伟大任务。您需要转换数据,实际上有很多方法可以做到这一点。一种现代方式可能是使用熊猫。Pandas让读取 CSV 数据变得非常容易(pd.read_csv('data.csv'))。然后,您可以使用GeeksForGeeks 上的这篇文章中解释的“groupby”之类的东西。

您也可以使用好的旧 python 来处理它。下面我提出我的想法。

(注意:“导入数据”只是包含您在问题/示例中作为 json 提供的数据的字典。)

from typing import List
import pprint

from data import data


def transform_dict(data: List[dict]) -> dict:
    transformed_data = dict()
    for obj in data:

        current_student = obj['STUDENT_ID']

        new_structure = {
            current_student: {
                'STUDENT_ID': obj['STUDENT_ID'],
                'FULL_NAME': obj['FULL_NAME'],
                'COURSE_NAME': obj['COURSE_NAME'],
                'DISCIPLINE_NAME': [obj['DISCIPLINE_NAME']]
            }
        }

        if current_student not in transformed_data:
            transformed_data.update(new_structure)
            continue

        transformed_data[current_student]['DISCIPLINE_NAME'].append(obj['DISCIPLINE_NAME'])

    return transformed_data


if __name__ == '__main__':
    solution = dict()
    for course, records in data.items():
        solution.update({course: transform_dict(records)})
    pprint.pprint(solution)

这将产生以下数据:

{'COM': {2: {'COURSE_NAME': 'COMERCIO',
             'DISCIPLINE_NAME': ['FUNDAMENTOS DO COMÉRCIO EXTERIOR',
                                 'PROJETO INTEGRADOR II',
                                 'LÍNGUA PORTUGUESA III',
                                 'QUÍMICA II',
                                 ' FÍSICA I',
                                 'EDUCAÇÃO FÍSICA I',
                                 'MATEMÁTICA III',
                                 'SOCIOLOGIA III',
                                 'FUNDAMENTOS DE CONTABILIDADE APLICADOS AO '
                                 'COMÉRCIO E SERVIÇOS',
                                 'BIOLOGIA III',
                                 'FILOSOFIA III'],
             'FULL_NAME': 'STUDENT_TWO',
             'STUDENT_ID': 2}},
 'GAM': {1: {'COURSE_NAME': 'GESTAO AMBIENTAL',
             'DISCIPLINE_NAME': ['BIOQUÍMICA AMBIENTAL',
                                 'GEOPROCESSAMENTO APLICADO À GESTÃO '
                                 'AMBIENTAL'],
             'FULL_NAME': 'STUDENT_ONE',
             'STUDENT_ID': 1}},
 'TME': {3: {'COURSE_NAME': 'TEORIAS E METODOLOGIAS DA EDUCAÇÃO',
             'DISCIPLINE_NAME': ['TRABALHO DE CONCLUSÃO DO CURSO'],
             'FULL_NAME': 'STUDENT_THREE',
             'STUDENT_ID': 3}}}

Process finished with exit code 0

我创建了一个新密钥,而不是仅使用对象:{"COM": {3: data}}。如果您想省略将数据映射到学生 ( {"COM": data}),您可以进行另一个转换:

def transform_again(data):
    transformed_data = dict()
    for obj in data:
        transformed_data.update(data[obj])
    return transformed_data

if __name__ == '__main__':
    solution = dict()
    for course, records in data.items():
        solution.update({course: transform_dict(records)})
    # pprint.pprint(solution)

    solution_2 = transform_again(solution['COM'])
    pprint.pprint(solution_2)

这将导致:

{'COURSE_NAME': 'COMERCIO',
 'DISCIPLINE_NAME': ['FUNDAMENTOS DO COMÉRCIO EXTERIOR',
                     'PROJETO INTEGRADOR II',
                     'LÍNGUA PORTUGUESA III',
                     'QUÍMICA II',
                     ' FÍSICA I',
                     'EDUCAÇÃO FÍSICA I',
                     'MATEMÁTICA III',
                     'SOCIOLOGIA III',
                     'FUNDAMENTOS DE CONTABILIDADE APLICADOS AO COMÉRCIO E '
                     'SERVIÇOS',
                     'BIOLOGIA III',
                     'FILOSOFIA III'],
 'FULL_NAME': 'STUDENT_TWO',
 'STUDENT_ID': 2}

现在您可以开始重构所有内容并提高效率。:) 这个回答很有趣,希望我的回答对你有帮助!祝你好运。


推荐阅读