chercher des valeurs dans un dictreader corespondantes aux valeurs d'un autre dictreader

a marqué ce sujet comme résolu.
Auteur du sujet

bonjour, je cherche a afficher pour chaque bp une liste de cass associées par exemple pour BP01: CS0621,CS0622,CS0627

table bp.csv

1
2
3
4
5
bp_code    
BP01   
BP02  
BP08   
BP09

table cass.csv

1
2
3
4
5
6
7
8
cs_code,cs_nb_pas,cs_bp_code   
CS0621,1,BP01   
CS0622,1,BP01    
CS0623,1,BP02    
CS0625,1,BP08    
CS0627,1,BP01    
CS0629,1,BP08     
CS0631,1,BP08    

mon code n’affiche que la liste de tte les cs_code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# -*- coding: utf-8 -*-

import csv

with open('bp.csv') as bp:
    reader = csv.DictReader(bp)
    # On crée une liste des données
    data = [row['bp_code'] for row in reader]

with open('cass.csv') as cass:
    reader = csv.DictReader(cass)
    res = []
    for row in reader:

        if row['cs_bp_code'] in data:
            res.append(row['cs_code'])


print(res)

`

j’apprécie toute remarque

Édité par mahaman1224

+0 -0

Staff

Encore une fois.

Utilise les balises de code pour poster tes CSV. Entoure tes fichier CSV de caractère ~ ou backquote. Comme tu le fais pour le code source.

Exemple :

1
2
3
4
5
```csv
bp_code
BP001
BP002
```

Ou encore :

1
2
3
4
5
~~~csv
cs_code,bp_code
qsfd,qwer
azer,dvor
~~~

Sinon, tu risques d’avoir des problèmes de formatage et on ne va pas comprendre ton problème. C’est pour que l’on puisse t’aider que je te répète cela.

Ton problème est le même que sur ton sujet précédent. C’est donc un doublon que je dois fermer. Continue sur le sujet précédent.

Edit: Ce n’est pas un doublon, le problème est vraiment différent. Mais les explications sur ce sujet ne sont pas claires.

Édité par ache

ache.one                 🦹                                          🦊

+2 -0

Il te faut une double boucle for :

1
2
3
4
5
6
7
Pour chaque ligne_bp de bp.csv
    cs_code = []
    Pour chaque ligne_cass de cass.csv
         si dernière colonne de ligne_cass == ligne_bp
             cs_code.append(première colonne de ligne_cass)

    print(cs_code)
+1 -0

Pourquoi utiliser bp.csv alors que tous les renseignements se trouvent dans cass.csv ?

Et puis pour du csv aussi simple, autant le faire avec les méthodes de fichiers textes standards.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
dict_result = {}
with open('cass.csv', 'r') as f:
    f.readline() # ignore first line
    for line in f:
        line_parsed = line.rstrip(' \n') # strip space and '\n'
        cs, n, bp = line_parsed.split(',') # unpacking
        if bp not in dict_result:
            dict_result[bp] = []
        dict_result[bp].append(cs)

print(dict_result)

print(dict_result['BP02']) # display ['CS0623']

`

Édité par fred1599

+1 -0

Pas forcément fred1599.

Si ça se trouve il veut afficher "BP03:" quand aucun cass ne correspond à ce BP.

ache.one                 🦹                                          🦊

+0 -0

Je pense alors à un problème de conception,

  • Comment et pourquoi est créé bp.csv ?
  • Pourquoi ces clés (bp.csv) ne peuvent pas être lues dans cass.csv directement et éviter l’écriture de bp.csv ?

Car si ces clés sont dans deux fichiers, alors il y a forte chance qu’il y est répétition de code.

+1 -0
Auteur du sujet

merci pour vos retours , les tables cass et bp sont deux tables liées par la reference cs_pb_code contiennent des disaines de données.
pour chaque bp on peut avoir un ou plusieurs cass,
l’idée c’est de créer une class bp contenant une liste de cass c prk il me faut se baser sur la clé pb_code à rechercher pour chaque bp les cass correspondantes dans cs_bp_code et les ajouter à la liste de cass de bp en question,
alors moi je suis bloqué sur la tache de rechercher a partir de bp_code

Édité par mahaman1224

+0 -0

Il n’y a rien de bloquant, en imaginant avoir repris mon code, il est très facile de parcourir bp.csv ligne par ligne

1
2
3
with open('bp.csv', 'r') as f:
    for line in f:
        print(dict_result[line.rstrip(' \n')]) # liste des cass

Par contre comme c’était pas très clair, je ne suis pas sûr que c’est ça que tu veux.

+1 -0
Auteur du sujet

@fred1599 je m’xcuse pour ma question car je suis débutante en python vous avez déclarer dans votre code py dict_result = {} comme étant un dictionnaire vide après py dict_result[bp] = [] j’ai essayé de l’adapter a mon code mais ça me donne comme erreur : TypeError: unhashable type: 'set'

Édité par mahaman1224

+0 -0

C’est certainement parceque fred1599 n’a pas lu avec le module csv mais directement comme un fichier.

Du coup, il a comme clé de dict_result une chaine de caractère, alors qu’avec un le module csv on a un set je suppose.

ache.one                 🦹                                          🦊

+1 -0

C’est un format de fichier simple certes mais autant utiliser les ressources qui fonctionnent et qui ont déjà fait leur preuve.

Ici la premère ligne ton code ne marche pas car ’bp_code’ est une header. Si demain une colonne est rajouté au fichier alors rien ne marche plus et si un des ’bp_code’ fini par une tabulation pareil.

Alors que tous ces cas étaient pris en compte par le module csv il me semble. Tu vois où je veux en venir ?

Édité par ache

ache.one                 🦹                                          🦊

+0 -0

Non ça change rien car csvreader ou dictreader lors de l’itération, ne fait que retourner la ligne suivante comme sur l’itération d’une ligne par la méthode standard avec split.

Pour la suite, ce n’est qu’une spécificité sur la demande du PO, il adaptera selon ses besoins, mais ça sera aussi le cas avec le module csv.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte