python - 将 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"
}
]
}
知道我该怎么做吗?
解决方案
这是用 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}
现在您可以开始重构所有内容并提高效率。:) 这个回答很有趣,希望我的回答对你有帮助!祝你好运。
推荐阅读
- r - 按组填写日期的缺失行
- c# - 片段管理器空引用异常
- python - 安装 jupyter 主题后,笔记本和 docker 容器不再工作
- shell - 在 shell 命令中删除和替换文件
- azure - powerBI azure 客户端应用程序对其他应用程序的权限以进行报表嵌入
- iterm2 - 以编程方式清除 iterm2 缓冲区
- spring-boot - Spring CLI 问题 - 无法在 CLI 中列出 Spring Cloud 服务
- php - url的htaccess配置
- c++ - 如何设计一个带有可选随机种子参数的函数以传递给 mt19937
- c# - 如何在 ASP.NET MVC 5 项目中编写单元测试?