chercher des valeurs dans dictreader pour les ajouter a une liste

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

bonjour, je dois faire un script en python pour la gestion des ces fichier pour en sortir un seul fichier

voici mon code qui me donnée l’erreur que name ’cs_pb_code’ is not defined , pourtant je l’ai définis

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
import os
import csv
with open('fille1/cass.csv') as cass:
    reader1 = csv.DictReader(cass)
    cs_pb_code
    for i in reader1:
        for k,v in row.items():
            if ([row['cs_pb_code']]) == row['pb_code']:
               cass.append(cs_pb_code)
with open('fille1/bp.csv') as bp:
    reader = csv.DictReader(bp)
    for row in reader:
         print(row['bp_code'])
class Pb:
    cass=[]

`

Édité par mahaman1224

+0 -0
Auteur du sujet

non cs_pb_code c’est la référence qui fait la jointure entre les deux tables je sais pas comment trouver les valeurs de pb_code dans la table pb qui correspondent a cs_pb_code dans la table cass c’est ça mon problème

+0 -0

Cette réponse a aidé l’auteur du sujet

Malheureusement ton problème est tout sauf explicite. Je pense que ce que pointe Angelo c’est qu’il y a une erreur d’indentation dans ton code.

Sinon, si tu veux récupérer la valeur d’une ligne associée à la clé 'cs_pb_code', c’est row['cs_pb_code'] qu’il faut utiliser, pas besoin d’itérer sur toutes les valeurs.

Mais comme tu sembles confondre noms de variables et chaînes de caractères, je pense qu’il faudrait commencer par revoir les bases du langage.

Auteur du sujet

@entwanne je suis débutante en python et j’ai revu les bases en fait j’ai des idées et je cherche a les transformer en bonne syntaxe mon question est ce que meme si je veux récupérer plusieur valeurs j’ai pas besoin d’itérer sur tte les valeurs? et comment je peux déclarer ce variable cs_pb_code sachant q’elle est en fichier csv sous format CS062100400002

Édité par mahaman1224

+0 -0

\o Salut

bonjour, j’ai 2 fichiers csv chacun de ces fichiers contient une table (cass: avec des champs cs_code, cs_pb_code..) et une table (bp avec les champs ! bp_code) si vous remarquez les deux tables ont une jointure avec la référence cs_pb_code , je dois faire un script en python pour la gestion des ces fichier pour en sortir un seul fichier donc la première étape c’était la lecture de ces deux fichiers avec dictreader et ça marche

Cool, jusqu’ici c’est compréhensible ^^

maintenant je cherche a trouver à partir de bp_code,dans la table cass , les cass correspondantes dans cs_bp_code et les ajouter à la liste de cass du pb en question voici mon code qui me donnée l’erreur que name ’cs_pb_code’ is not defined , pourtant je l’ai définis

Là, déjà moins.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
import os
import csv
with open('fille1/cass.csv') as cass:
    reader1 = csv.DictReader(cass)
    cs_pb_code
        for i in reader1:
        for k,v in row.items():
            if v == cs_pb_code:
               cass.append(cs_pb_code)
with open('fille1/bp.csv') as bp:
    reader = csv.DictReader(bp)
    for row in reader:
         print(row['bp_code'])
class Pb:
    cass=[]

`
mahaman1224

Dans le code, tu as un cs_pb_code qui traine on ne comprend pas pourquoi. De ce que je comprend, tu as voulu le déclarer. Mais ce n’est pas comme ça.

Je ne comprend pas ce que tu veux. Vraiment.

Le mieux, c’est avec un exemple. Construit un exemple de tes 2 fichiers csv (petit de manière à ce qu’il reste compréhensible et faisable à la main).

ache.one                 🦹         👾                                🦊

+1 -0
Auteur du sujet

merci pour votre réponse OK VOILA un exemple des tables csv

table 1

cs_code, cs_bp_code

CS062100554554,BP062100401123

CS062100400002 ,BP062100401126

CS062100989899,BP062100401127

CS058788889978,BP062566689623

table 2

bp_code

BP062100401123

BP062100401124

BP062100401125

BP062100401126

BP062100401127

BP062100401128

BP062100401129

BP062100401130

BP062100401131

BP062100401132

je cherche a ajouter dans une liste les cs_code dont les valeurs de cs_pb_code = pb_code

Édité par mahaman1224

+0 -0

Staff

Cette réponse a aidé l’auteur du sujet

Un effort de présentation est attendu, utilise les tabulations sinon tes tables sont illisibles. Je les ai modifiée moi même afin que l’on puisse t’aider.

Bon du coup, ce que tu dois faire, c’est lire la table 2, stocker l’ensemble des bp_code dans une liste, un set ou une table de hashage.

Ensuite, tu lis la table 1 et tu vérifies à chaque fois si bp_code est dans la structure qui stockait les bp_codes de la table 2. Ça se fait en python pas un in. Exemple : 5 in [1,2,5,10,20]. Si c’est le cas, tu enregistres dans une liste le cs_code.

Essaye de faire ça ;)

Édité par ache

ache.one                 🦹         👾                                🦊

+1 -0

Salut,

Ton fichier csv est mal formaté

Voici le bon format:

1
2
3
4
5
cs_code,cs_bp_code
CS062100554554,BP062100401123
CS062100400002,BP062100401126
CS062100989899,BP062100401127
CS058788889978,BP062566689623

Édité par Angelo

+1 -0
Auteur du sujet

oui exactement j’ai bien l’accès au données de fichier, mon problème c’est que j’arrive pas a extraire les valeurs de bp_code qui est dans la table 2 qui correspondent a cs_bp_code de la table 2 qlq chose manque dans mon code

Édité par mahaman1224

+0 -0

La logique à avoir est de :
- stoker toutes les valeurs bp_code de table_2
- lire la table_1, pour chaque ligne regarder si cs_bp_code est dans la liste
- si c’est le cas, faire un traitement

Édité par Angelo

+1 -0
Auteur du sujet
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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)
    refs = []
    for row in reader:

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

print(data)
print(refs)

Édité par mahaman1224

+0 -0

Cette réponse a aidé l’auteur du sujet

Tu as deux problèmes avec ton code, le premier est le mauvais formatage de tes fichiers csv qui contiennent des espaces en trop parfois (ça doit être réglable ça peu importe).

Le code du filtrage est moyen mais normalement tu as l’idée. Voici donc un code qui est un peu plus pythonique si je peux me permettre (plus lisible en tout cas).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import csv

data=[] # Liste des bp_code
res=[]  # Liste des cass ayant un bp_code connu

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)
    allFiltered = filter( lambda row : row['cs_bp_code'] in data , reader)

    allCassFiltered = map (lambda row : row['cs_code'], allFiltered)
    res = list(allCassFiltered)

print(res)

Ça devrait marcher et c’est lisible.

Bon courrage ;)

ache.one                 🦹         👾                                🦊

+1 -0
Auteur du sujet

oui c lisible merci infiniment pour votre aide, mais malheureusement ça m’affiche aussi toutes les cs_code que j’ai dans la table :euh: je crois que quelque chose ne va pas dans cette ligne allFiltered = filter( lambda row : row[’cs_bp_code’] in data , reader) ce que j’ai compris allFiltred doit retourner que les cs_code et les cs_bp_code qui = à bp_code mais en faisant print(allFiltered) ça m’affiche toutes les valeurs de cs_bp_code et cs_code

+0 -0

Oui c’est bien ça…
J’ai fais le test avec le code proposé par ache et le jeu de données suivant
bp.csv:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
bp_code
BP062100401123
BP062100401124
BP062100401125
BP062100401126
BP062100401127
BP062100401128
BP062100401129
BP062100401130
BP062100401131
BP062100401132

cass.csv

1
2
3
4
5
cs_code,cs_bp_code
CS062100554554,BP062100401123
CS062100400002,BP062100401126
CS062100989899,BP062100401127
CS058788889978,BP062566689623

et ça retourne bien les données souhaitées

Question pour ache: il y a une raison quant à l’utilisation de la variable res ?

Édité par Angelo

+0 -0

@mahaman1224: Le problème ne vient pas de ton code mais du format du fichier csv ! C’est pour cela que j’ai amélioré ton code (ton code fonctionnait déjà).

Le format donné par Angelo est le bon.

Sinon, il existe une option dans le reader de python pour supporter cette "extension" du format CSV. C’est skipinitialspace :

1
2
with open('bp.csv') as bp:
    reader = csv.DictReader(bp, skipinitialspace=True)

L’ajout important est celui de skipinitialspace=True en paramètre de DictReader.

@angelo: Oui il y a une raison. J’ai fais les modifs de tête et au lieu de retenir refs j’ai retenu res voila tout ^^"
Donc non ce n’est pas important.

ache.one                 🦹         👾                                🦊

+1 -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