IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Liste de Dictionnaire


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 80
    Par défaut Liste de Dictionnaire
    Bonjour,
    Je découvre python et la programmation informatique. Je ne trouve pas la solution et ne comprend pas pourquoi cela ne marche pas.
    Si une bonne âme pouvait m'aider...

    Voici mon problème:
    Je veux lire un fichier csv: et en extraire une liste de dictionnaire:
    gpio=[]#liste , indexe liste=n°pine, de dictionnaire représentant le couple :fonction pine et nom pine
    mon problème vien de la ligne 28 :gpio[nLigne]=dic
    quand je décomente cet ligne la boucle de lecture fait 2 tours puis génère une erreur.
    alors qu'a la ligne 27 la ligne print me sort le résulta que je souhaite obtenir??? Qu'est ce que je ne comprend pas, pourquoi ça bloque.
    Pour info, j'ai essayé avec csv.DictReader, ça marche mais la mise en forme des donnés ne me convient pas. Et le but n'est pas que cela marche, mais de comprendre pourquoi cela ne marche pas.

    gpio.csv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    GPIO-PINE;ALIM;IO;WiringPi;I2C;SDIO;JTAG;UART;PCM;1-WIRE;GPCLK
    1;3.3V;;;;;;;;;
    2;5V;;;;;;;;;
    3;;2;8;DATA;;;;;;
    4;5V;;;;;;;;;
    5;;3;9;CLOCK;;;;;;
    6;GND;;;;;;;;;
    7;;4;7;;;TDI(ALT5);;;DATA;GPCLK0
    8;;14;15;;;;TXD;;;
    9;GND;;;;;;;;;
    10;;15;16;;;;RXD;;;
    11;;17;0;;;;;;;
    12;;18;1;;;;;CLK;;
    13;;27;2;;DAT3;TMS(ALT4);;;;
    14;GND;;;;;;;;;
    15;;22;3;;CLK;TRST(ALT4);;;;
    16;;23;4;;CMD;RTCK(ALT4);;;;
    17;3.3V;;;;;;;;;
    18;;24;5;;DAT0;TDO(ALT4);;;;
    19;;10;12;;;;;;;
    20;GND;;;;;;;;;
    21;;9;13;;DAT1;;;;;
    22;;25;6;;;TCK(ALT4);;;;
    23;;23;14;;;;;;;
    24;;8;10;;;;;;;
    25;GND;;;;;;;;;
    26;;7;11;;;;;;;
    27;;0;30;EEPROM DATA;;;;;;
    28;;1;31;EEPROM CLOCK;;;;;;
    29;;5;21;;;TDO(ALT5);;;;GPCLK1
    30;GND;;;;;;;;;
    31;;6;22;;;RTCK(ALT5);;;;GPCLK2
    32;;12;26;;;TMS(ALT5);;;;
    33;;13;23;;;TCK(ALT5);;;;
    34;GND;;;;;;;;;
    35;;19;24;;;;;FS;;
    36;;16;27;;;;;;;
    37;;26;25;;DAT2;TDI(ALT4);;DIN;;
    38;;20;28;;;;;;;
    39;GND;;;;;;;;;
    40;;21;29;;;;;DOUT;;
    programme test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import csv, sys
    filename = 'gpio2.csv'
    with open(filename, newline='') as f:
     
        reader = csv.reader(f,delimiter='\t',quotechar='"',  quoting=csv.QUOTE_NONNUMERIC)
        nLigne = 0
        dic={}
        gpio=[]
        Entete=[]
        try:
            for lig in reader:
                print (nLigne)
                if nLigne == 0 :
                    Entete=lig
                    print (Entete)
                else:
     #                   print (lig)
                        dic={}
                        for id in range(len(lig)):
                            #print((id), type(id), type(lig[id]))
     #                       print (  id, lig[id])
                            if id>0 and lig[id]!='':
     #                           print (Entete[id])
     #                           print(lig[id])
                                dic[Entete[id]]= lig[id]
     #                           print (lig[0], dic)
                        print(type(nLigne), nLigne, type(dic), dic)
     #                   gpio[nLigne]=dic
    #                    print(gpio)
                nLigne = nLigne+1
     
     
     
        except csv.Error as e:
            sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Ça serait pas ce que fait la classe DictReader ?

    Bref ça donnerait moins de lignes,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import csv
     
    with open("gpio2.csv", 'r') as f:
        reader = csv.DictReader(f, delimiter=";")
        for line in reader:
            d = dict(line)
            print(d)

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 80
    Par défaut
    A je me suis trompé dans mon premier message, je vais l'édité:
    j'avais écrit: Pour info, j'ai essayé avec csv.reader, ça marche mais la mise en forme des donnés ne me convient pas.
    je voulais dire : Pour info, j'ai essayé avec csv.DictReader, ça marche mais la mise en forme des donnés ne me convient pas.

    Je te remercie pour ta réponse, mais ce que j'aimerai, c'est comprendre pourquoi la ligne 28 :gpio[nLigne]=dic ne marche pas.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2016
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2016
    Messages : 30
    Par défaut
    Si j'ai bien suivi tes variables.
    A la ligne 28 ta variable gpio est une liste vide elle n'a pas d'élément d'index 0.
    il faut remplacer la ligne par je n'ai pas cherché à comprendre ce que tu veux faire, mais mettre tout le dictionnaire dans la liste me parait curieux.

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    La base aurait été de montrer le message d'erreur...

    Et je vois pas l'intérêt des paramètres dans csv.reader(...), et pourquoi delimiter vaut '\t' au lieu de ';'

  6. #6
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 80
    Par défaut
    Je vous remercie beaucoup pour vos intervention, cela ma bien débloqué.

    Ce que j'ai appris: (dite moi si je me trompe)
    gpio[a]=b est une liste et attend une liste en entrée -> gpio[a]=[b]
    gpio[a]=b ne peut crée un nouvelle élément d'une liste mais seulement modifié un élément existant
    pour la création de nouvelle élément, uniquement a la suite du dernier élément: gpio.append(b) ou gpio=gpio+[b]


    Et je vois pas l'intérêt des paramètres dans csv.reader(...), et pourquoi delimiter vaut '\t' au lieu de ';'
    Oui vous avez complètement raison: Mon bureau étant mal ranger, lors de mes tests de la fonction csv.reader, j'avais fait des essais avec des fichier a séparation ';' et 'TAB' et je n'est pas déposé le bon fichier dans mon premier message.


    je n'ai pas cherché à comprendre ce que tu veux faire, mais mettre tout le dictionnaire dans la liste me parait curieux.
    Le tableau permet de décrire les pines (ou broche,ou bornes) d'une carte électronique.
    Chaque pine peuvent être configuré pour plusieurs fonction, les différente fonction sont désigner dans la première ligne du tableau.
    pour chaque fonction de la pine, celle-ci aura un usage différent désigné par un nom de la pine décrivant sont usage.

    Les broches de la carte étant déterminé et inchangeable, j'utilise une liste pour les classés
    Le nom des broches étant variable en fonction de la configuration, je les range dans un dictionnaire afin de pouvoir y accédé plus tard en connaissant la configuration de la broche.
    Donc une liste de dictionnaire.

    Je me trompe dans mon approche?


    Je suis passé a ces codes:
    csv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    "GPIO-PINE"	"ALIM"	"IO"	"WiringPi"	"I2C"	"SDIO"	"JTAG"	"UART"	"PCM"	"1-WIRE"	"GPCLK"
    1	"3.3V"									
    2	"5V"									
    3		2	8	"DATA"						
    4	"5V"									
    5		3	9	"CLOCK"						
    6	"GND"									
    7		4	7			"TDI(ALT5)"			"DATA"	"GPCLK0"
    8		14	15				"TXD"			
    9	"GND"									
    10		15	16				"RXD"			
    11		17	0							
    12		18	1					"CLK"		
    13		27	2		"DAT3"	"TMS(ALT4)"				
    14	"GND"									
    15		22	3		"CLK"	"TRST(ALT4)"				
    16		23	4		"CMD"	"RTCK(ALT4)"				
    17	"3.3V"									
    18		24	5		"DAT0"	"TDO(ALT4)"				
    19		10	12							
    20	"GND"									
    21		9	13		"DAT1"					
    22		25	6			"TCK(ALT4)"				
    23		23	14							
    24		8	10							
    25	"GND"									
    26		7	11							
    27		0	30	"EEPROM DATA"						
    28		1	31	"EEPROM CLOCK"						
    29		5	21			"TDO(ALT5)"				"GPCLK1"
    30	"GND"									
    31		6	22			"RTCK(ALT5)"				"GPCLK2"
    32		12	26			"TMS(ALT5)"				
    33		13	23			"TCK(ALT5)"				
    34	"GND"									
    35		19	24					"FS"		
    36		16	27							
    37		26	25		"DAT2"	"TDI(ALT4)"		"DIN"		
    38		20	28							
    39	"GND"									
    40		21	29					"DOUT"
    test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    import csv, sys
    filename = 'gpio2.csv'
    with open(filename, newline='') as f:
     
        reader = csv.reader(f,delimiter='\t',quotechar='"',  quoting=csv.QUOTE_NONNUMERIC)
        datas = [ligne for ligne in reader]
        nLigne = 0
        dic={}
        gpio=[]
        try:
            for lig in datas:
                if nLigne == 0 :
                    gpio.append(lig)
                else:
                        dic={}
                        for id in range(len(lig)):
                            if id>0 and lig[id]!='':
                                dic[gpio[0][id]]= lig[id]  
    #                    gpio[nLigne]=dic   #Ligne de code erroné
    #                    gpio=gpio+[dic]
                        gpio.append(dic)
                nLigne = nLigne+1
            print(gpio)
     
     
     
        except csv.Error as e:
            sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))

Discussions similaires

  1. liste, Tuple, dictionnaire, ou ?
    Par Pascalist dans le forum Général Python
    Réponses: 25
    Dernier message: 11/12/2011, 11h00
  2. opérations sur listes et dictionnaires
    Par rom44 dans le forum Général Python
    Réponses: 20
    Dernier message: 14/10/2010, 00h49
  3. Mise a jour liste de dictionnaire
    Par Invité(e) dans le forum Général Python
    Réponses: 6
    Dernier message: 19/10/2009, 16h07
  4. Dictionnaire de liste -> liste de dictionnaire
    Par ju_bicycle dans le forum Général Python
    Réponses: 8
    Dernier message: 01/07/2009, 12h43
  5. Listes et dictionnaire
    Par Victoria007 dans le forum Général Python
    Réponses: 3
    Dernier message: 19/05/2008, 22h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo