éventuellement avec du replace.
éventuellement avec du replace.
Pas d'aide par mp.
Bien sûr que çà ne marche pas puisque vous êtes parti sur try...except. Mais ce que vous auriez pu en retenir c'est qui faut bien avoir une valeur pas défaut pour remplir les cases ou la conversion en float plante.
Et dans:
quelque part, si la convertion en float "plante", c'est peut être dans le traitement de l'exception qu'il sera judicieux d'assigner une valeur par défaut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 try: # on essaie de récupérer un float except ValueError: ....
Vous galérez parce que vous voulez programmer sans avoir pris le temps d'ouvrir un tuto. pour apprendre les bases. C'est votre choix.
- W
Je suis bien d'accord, on a pas trop envie d'aider, car déjà faire des copie d'écran au lieu de copie de texte que l'on met dans la balise code (le petit bouton avec le hashtag - # - ) , c'est très agaçant.
Si on devait parler du code en général:
-on charge le fichier une première fois
-on découpe le fichier en mémoire et on met le résultat ailleurs
-puis on traite encore ce découpage ailleurs.
En gros, on prend la taille du fichier que l'on multiplie par 3 et on aura une vague idée de la quantité de mémoire que l'on aura besoin rien que pour le fichier...
La lecture d'un tuto s'impose vraiment...
Cordialement.
Je savais pas que l'on pouvais inserer directement le code avec le hastag c'est pour cela je prenais des captures d'écran pour montrer...merci pour l'infos ...'ai suivi une serie de tutos sur python avant de commecé a faire ce projet je me suis dit ce sera bien de faire un petit projet ou je pourrias utiliser les étapes appris avec le tuto...je pense que je vais chercher une methode pour remplacer les case vide du fichier par des chiffres zéro (0) directement et pas les enlever...peut etre que ce sera plus simple pour le traitement?
Si le calcul est valeur[fin]/valeur[debut], çà va planter à cause de la division par 0.
Et de toutes façons, s'il n'y a pas de "mesure" de la population à une date donnée, toute valeur par défaut sortira un résultat qui ne voudra rien dire (la division fonctionne mais le nombre que çà sort sera quand même n'importe quoi).
Il serait peut être moins faux de ne rien sortir là où les informations n'existent pas.
Ceci dit, on sort un peu de la programmation Python pour se poser des questions sur l'interprétation des résultats produits par le code et de la responsabilité qu'on peut avoir (en tant que programmeur) à gérer les défauts dans les informations.
- W
Bon, allez, j'avais 10 minutes à tuer, donc voici un exemple rapide qui peux traiter au moins toute la première partie moyennant quelques modifications:
Le fichier exemple à traiter:
Le script:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $ cat /tmp/exemple.csv pays,code,indic,annee 1,annee 2,annee 3 france,FRE,SP.POP,30,35,47 espagne,ESP,SP.POP,25,56,98 angleterre,LDN,SP.POP,60,61,62 erance,FRE,SP.POP," ",35,47 dspagne,ESP,SP.POP,00,56,98 tngleterre,LDN,SP.POP,60.6,61,62
Un exemple d’exécution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 $ cat sanstitre0.py #!/usr/bin/env python3 # -*- coding: utf-8 -*- pays = {} with open("/tmp/exemple.csv",mode='r') as fd: fd.readline() for ligne in fd: ligne=ligne.strip().split(",") pays[ligne[0]]={i:int(float(j)) for i,j in zip(range(1960,1960+len(ligne[3:])),ligne[3:]) if j.replace('.','',1).replace('0','').isdigit()} for tab in pays: print(tab,"=>",pays[tab])
Ici, le script crée ton tableau pays, en ne prenant pas en compte les cas ou les données de population sont autre chose qu'un entier ou un flottant ainsi que le cas ou la donnée est zéro.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $ python3 ./sanstitre0.py france => {1960: 30, 1961: 35, 1962: 47} espagne => {1960: 25, 1961: 56, 1962: 98} angleterre => {1960: 60, 1961: 61, 1962: 62} erance => {1961: 35, 1962: 47} dspagne => {1961: 56, 1962: 98} tngleterre => {1960: 60, 1961: 61, 1962: 62}
Cordialement.
@disedorgue,
Selon l'exemple donné, il me semble que l'utilisation du module csv et sa classe DictReader devrait simplifier grandement la vie.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Je suis d'accord, mais comme d'après ce qu'elle dit, c'est pour apprendre, je suis resté au même niveau à part peut-être pour la fonction zip.
PS: Et moi, ça m’entraîne aussi
Cordialement.
Dans la même idée, voici une proposition
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 import csv with open('exemple.csv') as f: lines = csv.DictReader(f) for row in lines: for key in row: if key.startswith('annee'): try: row.update({key: int(float(row[key]))}) except ValueError: continue print(row)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Pas sur que ça l'arrange plus que ça, car par exemple avec une ligne csv du type:
on obtient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part erance,FRE,SP.POP," ",35,47
Et d'après ce que j'en ai compris, il faut justement ne pas en tenir compte, tout comme celles avec la valeur zéro...
Code : Sélectionner tout - Visualiser dans une fenêtre à part OrderedDict([('pays', 'erance'), ('code', 'FRE'), ('indic', 'SP.POP'), ('annee 1', ' '), ('annee 2', 35), ('annee 3', 47)])
d'où mon if j.replace('.','',1).replace('0','').isdigit().
Mais, bon, à elle de voir tout ça.
Cordialement.
Sur un dictionnaire, c'est l'affichage de celui-ci où le filtre doit être appliqué et non sur sa création. Il risque des problèmes liés à la taille du dictionnaire.
En ce qui me concerne, je remplacerai par None toutes les valeurs non castables, puis je filtrerai pour l'affichage final. Ça ne me fait pas de gros changement (remplacement d'une ligne dans except et sur l'affichage).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 import csv with open('exemple.csv') as f: lines = csv.DictReader(f) for row in lines: for key in row: if key.startswith('annee'): try: row.update({key: int(float(row[key]))}) except ValueError: row.update({key: None}) print({k: v for k, v in row.items() if v})
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Il y a une raison pour ça, ou c'est juste une règle ?
Car ici (et je dis bien ici), je ne vois pas l’intérêt de mettre une valeur incorrecte à None, autant ne pas la mettre puisque l'on connait l'intervalle (les clés), on déduit facilement que si celle-ci n'existe pas, que la valeur est invalide.
Sinon, une version corrigée qui ne charge plus tout en mémoire:
(Bon, je ne suis pas sure qu'elle comprenne tout, mais en tout cas, c'est très instructif pour ma part)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #!/usr/bin/env python3 # -*- coding: utf-8 -*- with open("/tmp/exemple.csv",mode='r') as fd: fd.readline() for ligne in fd: ligne=ligne.strip().split(",") pays={ligne[0]: {i:int(float(j)) for i,j in zip(range(1960,1960+len(ligne[3:])),ligne[3:]) if j.replace('.','',1).replace('0','').isdigit()}} for tab in pays: print(tab,"=>",pays[tab].items())
Cordialement.
Non ce n'est pas une règle, on va dire l'expérience de bosser avec les dictionnaires et les différentes difficultés lors de certaines modifications des tailles du dictionnaire.
Après, tant que ça fait le café...
Pour mes choix je le fais pour diverses raisons,
- La clé existe, et même si la valeur n'est pas acceptée pour une clé sur une ligne, elle le sera pour d'autres lignes.
- Si je souhaite modifier la valeur de la clé non valide pour l'écrire dans le fichier par la suite
Je trouve que mon code est modulable, même si il n'y a pas forcément besoin que ça le soit immédiatement, certains PO exigent par la suite des modifications qui peuvent poser problème selon le code qu'on présente au départ.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager