Je veux fusionner deux fichiers CSV que j'ai lus en python en utilisant le code suivant,

a = csv.DictReader(csv1)
b = csv.DictReader(csv2)

aMap = {}
bMap = {}

for row in a:
    aMap[row['id']] = row

for row in b:
    bMap[row['id']] = row

Maintenant, je devrais avoir deux dictionnaires dont les clés sont le champ «id» des deux CSV. Ce que je veux faire, c'est tout prendre de l'aMap et ajouter les valeurs aux valeurs de clé correspondantes dans bMap. Par exemple, dans aMap, une clé du dictionnaire ressemble à ceci,

'123456' : {'name': 'SomeName', 'type': 'someType'}

Et ce que j'ai dans bMap c'est

'123456' : {'location' : 'someLocation'}

Et ce que je veux c'est

'123456' : {'location' : 'someLocation', 'name' : 'SomeName', 'type' : 'someType'}

Existe-t-il une fonction spécifique pour cela ou dois-je créer un nouveau dictionnaire? Quelque chose de similaire à update () mais juste en ajoutant des valeurs au lieu de mettre à jour.

1
user611105 24 oct. 2011 à 22:09

3 réponses

Meilleure réponse

Vous pouvez utiliser un collections.defaultdict et utiliser update pour fusionner les lignes de csv2.

import collections

aMap = collections.defaultdict(dict)

for row in csv.DictReader(csv1):
    aMap[row['id']] = row

for row in csv.DictReader(csv2):
    aMap[row['id']].update(row)
1
unutbu 24 oct. 2011 à 18:37

Je pense que vous pouvez utiliser le defaultdict dans le module collections pour cela. http://docs.python.org/library/collections.html#collections.defaultdict

Je pense que les exemples sont assez proches d'être exactement ce que vous voulez.

0
Bryce 24 oct. 2011 à 18:31

Je ne pense pas qu'il existe une fonction intégrée pour cela. Vous devrez donc faire quelque chose comme

def AppendToValues(from_map, to_map):
  for key in from_map:
    to_map[key] = to_map.get(key, {})
    to_map.update(from_map.get(key, {}))

Pour supprimer la clé, la valeur de la carte:

del my_map[key]
0
Evgeny 24 oct. 2011 à 18:21
7879868