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 :

Python : problème lecture de fichier csv [Python 2.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 25
    Par défaut Python : problème lecture de fichier csv
    Bonjour à tous,
    Je suis actuellement en train d'écrire un code pour lire un fichier csv. J'ai quasiment réussi mais il me reste un petit problème que je n'arrive pas à résoudre.
    Voici mon code :

    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
    def read_csv(csvFile):
        result = {}
        with open(csvFile, 'r') as f:
            for line in f:
                columns = line.split(',')
                keys = result.keys()
                count = len(keys)
                if count == 0:
                    for val in columns:
                        name = val.strip()
                        if name:
                            if name in result:
                                raise ValueError('encountered {0} multiple times in the headers'.format(name))
                            result[name] = 0.0
                    pass
                # we already added headers, so this will be the values
                else:
                    values = []
                    for val in columns:
                        trimmed = val.strip()
                        if trimmed:
                            values.append(float(val))
     
                    if len(values) != count:
                        raise ValueError('expected same number of data points as headers')
     
                    for i in range(count):
                        result[keys[i]] = values[i]
     
        return result
    Nom : Capture d’écran (92).png
Affichages : 404
Taille : 6,3 Ko
    Mon problème est que quand je lis mon fichier csv (je n'ai pas réussi à le joindre en pièces jointes ) , au lieu d'avoir le paramètre R1 avec la valeur 1, le paramètre R2 avec la valeur 2 etc , je me retrouve avec R2 ayant comme valeur 5 , même problème pour les autres.
    Nom : Capture d’écran (93).png
Affichages : 298
Taille : 5,5 Ko

    Je n'arrive pas à trouver d'où vient ce problème, actuellement c'est un fichier test, mais mon fichier initial a 56 paramètres, et j'ai vraiment l'impression que les paramètres et leurs valeurs sont attribués aléatoirement, pourriez vous m'aider svp?

    Merci beaucoup!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 681
    Par défaut
    Salut,

    C'est pas compliqué: avec une version de Python antérieure à 3.6, l'ordre des clefs d'un dictionnaire n'est pas préservé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> keys = [ 'R%d' % x for x in range(1, 6) ]
    >>> keys
    ['R1', 'R2', 'R3', 'R4', 'R5']
    >>> d = { s: 0.0 for s in keys }
    >>> d
    {'R5': 0.0, 'R1': 0.0, 'R4': 0.0, 'R3': 0.0, 'R2': 0.0}
    >>> d.keys()
    dict_keys(['R5', 'R1', 'R4', 'R3', 'R2'])
    >>>
    (et pour les versions >= 3.6, cette préservation n'étant qu'un effet de bord de l'implémentation, on fait "sans").

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 25
    Par défaut
    Merci pour votre réponse.
    Il m'est donc impossible de conserver l'ordre des clés dans ma fonction "read_csv" ? Comment pourrai-je alors obtenir mon résultat attendu : " R1 : 1.0 , R2 : 2.0 , R3 : 3.0 .... " toujours à partir de mon fichier csv ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 681
    Par défaut
    Salut,

    Citation Envoyé par robinooo Voir le message
    Il m'est donc impossible de conserver l'ordre des clés dans ma fonction "read_csv" ? Comment pourrai-je alors obtenir mon résultat attendu : " R1 : 1.0 , R2 : 2.0 , R3 : 3.0 .... " toujours à partir de mon fichier csv ?
    Je ne comprends pas ce que vous cherchez à faire.
    Déjà côté lecture du fichier CSV, vous ne retournez que le contenu de la première et de la dernière ligne.
    Si vos fichiers ne font que 2 lignes, çà serait mieux de simplifier: lecture des labels, puis des valeurs sous forme de listes.
    Puis la question est de savoir ce que vous voulez faire de ces 2 listes: pour les afficher, pas besoin d'en faire un dictionnaire, et si vous voulez en faire un dictionnaire, pensez à zip:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> dict(zip('abc', '123'))
    {'b': '2', 'c': '3', 'a': '1'}
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 25
    Par défaut
    Je vous explique ce que je cherche à faire.
    Sur Matlab je possède un jeu de paramètres : 1000 x 56 paramètres. Avec Matlab je crée un fichier csv, sur la première ligne de ce fichier : les "noms" des paramètres et sur la seconde leurs valeurs. Après avoir créer ce fichier j'utilise une fonction sur Python :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     def update_values(fileName, csvFile, outputFile):
     
        # initialize if it didn't happen
        global dataModel
        if dataModel is None:
            dataModel = CCopasiRootContainer.addDatamodel()
     
        assert (isinstance(dataModel, CCopasiDataModel))
     
        # load COPASI file
        try:
            if not dataModel.loadModel(fileName):
                raise Exception("couldn't load file")
        except:
            print ("The COPASI file could not be loaded")
            print (CCopasiMessage.getAllMessageText())
            return
     
        model = dataModel.getModel()
        assert (isinstance(model, CModel))
     
        parameter_value_pairs = read_csv(csvFile)
        if not any(parameter_value_pairs):
            print ('no data found in the csv file')
            return
     
        changed_values = False
        for key in parameter_value_pairs.keys():
            mv = model.getModelValue(key)
            if mv is None:
                print ('no modelvalue for key: {0}'.format(key))
                continue
     
            assert (isinstance(mv, CModelValue))
            mv.setInitialValue(parameter_value_pairs[key])
            print ('changed {0} to {1}'.format(key, parameter_value_pairs[key]))
            changed_values = True
     
        # update initial values if changed
        if changed_values:
            model.compileIfNecessary()
     
        # save file (overwriting if the file exists)
        dataModel.saveModel(outputFile, True)
        pass
     
     
    if __name__ == "__main__":
        if len(sys.argv) < 4:
            print ("usage update_modelvalues <CPS file> <CSV file> <OUTPUT CPS file>.")
            sys.exit(1)
        update_values(sys.argv[1], sys.argv[2], sys.argv[3])

    Cette fonction me permet de lire le fichier csv et de modifier les valeurs dans un logiciel, COPASI. Dans ce logiciel les 56 "noms de paramètres" sont déjà "rentrés" mais étant donné que j'ai 1000 jeu de 56 paramètres , il serait long de rentrer toutes les valeurs à la main. Cette fonction me permet donc de modifier les valeurs des paramètres sans rentrer dans le logiciel. Après cette modification je peux ensuite effectuer une analyse métabolique avec le logiciel COPASI via python.

    Donc pour résumé
    1) Création d'un fichier csv à l'aide de Matlab (avec un jeu de 56 paramètres, noms sur la 1ère ligne, valeurs sur la 2eme)
    2) Lecture de ce fichier et modification des paramètres dans COPASI
    3) Analyse sur COPASI via python ( = mon résultat final que je souhaite avoir en x 1000)

    ensuite on recommence

    1) Modification du fichier Matlab (avec un nouveau jeu de 56 paramètres, uniquement les valeurs sur la 2eme ligne changent)
    2) Lecture et modification
    3) Analyse

    J'aimerais ensuite mettre ça dans une boucle mais pour l'instant je bloque au niveau de ma fonction de lecture du fichier csv qui n'associe pas le 1er paramètre de la ligne 1 , à la 1ère valeur de paramètre sur la ligne 2.
    La fonction update fonctionne très bien mais elle modifie les mauvais paramètres dû à mon problème de lecture du fichier csv. (exemple : pour mon paramètre 47 , j'ai la valeur du paramètre 36).
    Voilà j'espère avoir été assez clair.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 681
    Par défaut
    Salut,

    Citation Envoyé par robinooo Voir le message
    Voilà j'espère avoir été assez clair.
    Certes mais çà se ramène toujours une liste de labels et une liste de valeurs et des index associés et aucune indication sur ce que doit retourner la fonction read_csv et des solutions proposées dans mon post précédent qui n'ont pas été lues...
    C'est pourtant pas compliqué de réfléchir un peu à ce que font:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> labels = list('abc')
    >>> values = [1, 2, 3 ]
    >>> for ix, v in zip(labels, values):
    ...     print (ix, ':', v, end= ' ')
    ...
    a : 1 b : 2 c : 3 
    >>>
    >>> dict(zip(labels, values))
    {'b': 2, 'c': 3, 'a': 1}
    >>>
    et de voir comment appliquer çà à votre cas...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Par défaut
    Je suis d'accord avec @wiztricks pour dire que votre problème n'est pas très bien décrit et qu'une autre approche serait sans doute plus simple. Toutefois pour répondre exactement à la question, il existe OrderedDict qui préserve l'ordre des clés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from collections import OrderedDict

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 25
    Par défaut
    Merci pour vos réponses !! Wiztricks , j'ai essayé avec ta méthode, j'ai pas trop réussi à l'adapter à mon cas ... Mais avec la méthode du OrderedDict ça marche ! Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème sur lecture de fichier CSV
    Par raphael75015 dans le forum Général Java
    Réponses: 2
    Dernier message: 01/08/2016, 16h19
  2. Problème lecture de fichier python
    Par dude91820 dans le forum Général Python
    Réponses: 4
    Dernier message: 03/04/2015, 12h22
  3. problème lecture seule fichier image
    Par Damien69 dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2007, 16h53
  4. [CSV] Problème avec un fichier csv
    Par gregal dans le forum Langage
    Réponses: 7
    Dernier message: 13/02/2007, 11h23
  5. problème lecture de fichier
    Par nico33410 dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2006, 20h01

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