python - 从两个 csv 文件创建嵌套字典

标签 python csv dictionary nested key-value

我有两个 csv 文件
文件1.csv:

ID,map1,map2  
a,x1,x2  
b,y1,  
c,z1,z2  

文件2.csv:

ID,map1Val1,map1Val2,map2Val1
a,a1,a2,l1
b,b1,b2,
c,c1,c2,n1

我希望输出看起来像:

{'ID': {'map1':['map1Val1','map1Val2'], 'map2':'map2Val1'},'a': {'x1':['a1','a2'], 'x2':'l1'},'b': {'y1':['b1','b2']},'c': {'z1':['c1','c2'], 'z2':'n1'},}  

我想不出任何方法来创建这个。到目前为止,我只有一段代码可以从一个 csv 文件创建字典:

import csv
new_data_dict = {}
with open("file1.csv", 'r') as map_file:
    mapping = csv.DictReader(map_file, delimiter=",")
    for row in mapping:
        new_data_dict= {row[0]:{row[1],row[2]}}
print new_data_dict

输出:

{"ID":{map1,map2}, "a":{x1,x2}, "b":{y1}, "a":{z1,z2}}

最佳答案

这是一个更加动态的解决方案,允许您预先配置 file1 中的哪些列映射到 file2 中的哪些列:

import csv

 = {'map1': ['map1Val1', 'map1Val2'],
              'map2': ['map2Val1']
              }

joined_data = dict()
joined_data['ID'] = column_map

with open("file1.txt") as f1, open("file2.txt") as f2:
    key_list = list(csv.DictReader(f1))
    value_list = list(csv.DictReader(f2))

for kl, vl in zip(key_list, value_list):
    inner = {}
    for key, value_list in column_map.items():
        if kl[key]:
            inner[kl[key]] = [vl[el] for el in value_list]

    joined_data[kl['ID']] = inner

使用 csv.DictReader 可以让我们将每一行的数据映射到 dict 中,其键(默认情况下)由文件的第一行给出。这两个 DictReader 对象被转换为列表并使用 zip 进行迭代。使用column_map作为指导,我们创建一个新的inner字典,将key_list中的键与value_list中的值关联起来。

编辑

对于完全动态的解决方案,您可以通过将 file1 中的列标题与 file2 中的列标题进行比较来动态创建 column_map

import csv
from collections import defaultdict

joined_data = dict()
column_map = defaultdict(list)

with open("file1.txt") as f1, open("file2.txt") as f2:
    kh = next(f1).strip()
    vh = next(f2).strip()
    key_headers = kh.split(',')
    value_headers = vh.split(',')

    [column_map[k].append(v) for k in key_headers[1:] for v in value_headers[1:] if v.startswith(k)]
    joined_data['ID'] = dict(column_map)

    key_list = list(csv.DictReader(f1, fieldnames=key_headers))
    value_list = list(csv.DictReader(f2, fieldnames=value_headers))

for kl, vl in zip(key_list, value_list):
    inner = {}
    for key, value_list in column_map.items():
        if kl[key]:
            inner[kl[key]] = [vl[el] for el in value_list]

    joined_data[kl['ID']] = inner

关于python - 从两个 csv 文件创建嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42604594/

相关文章:

python - 在python中的gstreamer中使用speex的问题

python - 在 python 函数中保存字典值

javascript - Python 字典与 Javascript 对象有什么区别?

缺少 R 参数,没有默认值

vba - 字典不显示特定键(数值)的项目

python - 迭代 `OrderedDict` 并删除它的一些键?

python - 以编程方式将图像保存到 Django ImageField

Python gRPC 服务器不监听指定端口

excel - 根据文件中的工作表名称从 pandas 数据框创建 csv 文件

json - D3.js - 从 csv 数据构建一个力导向的层次树