chercher des valeurs dans dictreader pour les ajouter a une liste

Le problème exposé dans ce sujet a été résolu.

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=[]

`
+0 -0

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.

@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

+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).

+1 -0

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

+0 -0

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 ;)

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

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 ;)

+1 -0

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

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 ?

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

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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