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 :

importer un fichier csv


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 30
    Points
    30
    Par défaut importer un fichier csv
    Bonjour

    j'essaie d'importer un fichier csv dans ma base

    pour ca j'ai ecris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    filename = 'C:/Users/patrice/Documents/base/data50.csv'
        dataReader = csv.reader(open(filename), delimiter=';', quotechar='"')
        for row in dataReader:
            try:
                print row[0]
                print row[1]
                print row[2]
                print row[3]
                print row[4]
                print row[5]
     
            except csv.Error as e:
                sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

    j'obtiens pour row[0]

    id
    name
    nature_unit
    choix
    valT
    val10
    0

    pour row[1]
    0
    Al2O3
    Mechanical
    11
    146
    214
    0

    si j'ecris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for row in dataReader:
            try:
                print row
    alors je liste tout le fichier et j'ai

    ['id', 'name', 'nature_unit', 'choix', 'valT', 'val10', 'val_ref']
    ['0', 'Al2O3', 'Mechanical', 'Hardness Vickers', '146', '213', 'CT_77']
    ['0', 'Al2O3', 'Mechanical', 'Hardness Vickers', '146', '214', 'CT_78']
    ['0', 'Al2O3', 'Mechanical', 'Hardness Vickers', '146', '212', 'CT_79']
    ['0', 'Al2O3', 'Mechanical', 'Hardness Vickers', '167', '234', 'CT_80']
    ['0', 'Al2O3', 'Mechanical', 'Hardness Vickers', '167', '237', 'CT_81']
    ['0', 'Al2O3', 'Mechanical', 'Hardness Vickers', '167', '235', 'CT_82']

    comment fait on pour acceder a chaque element ?

    par exemple acceder a Mechanical

    comment fait on pour acceder a chaque element du fichier sans passer par un indice ?

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    On dirait des listes de listes (une sorte de matrice). Si tel est le cas, essaie de remplacer "print row" par "print row[x][2]".

    EDIT: Je parle en acces direct. Sinon, j'avais pas vu la derniere question. Tu dois passer par un indice pas le choix pour des listes.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 30
    Points
    30
    Par défaut importer un fichier csv
    lorsque je fais un print a la fin de lecture du fichier j recupere bien chaque element de la dernier ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for row in dataReader:
            try:
                print row
     
            except csv.Error as e:
                sys.exit('file %s, line %d: %s' % (filename, dataReader.line_num, e))
    print '---------------------------'
    print row[1]
    print row[2]
    avec row[1] : Al2O3, row[2] : Mechanical

    le probleme serait de pouvoir recuperer chaque element de chaque ligne a l'interieur de la boucle..

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Je te conseille d'utiliser DictReader, dans ton cas, il sera adaptable à toutes les sauces.

    Tu pourras renvoyer pour chaque ligne son nom de colonne et sa valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import csv
     
    with open('fichier.csv', 'r') as f:
        reader = csv.DictReader(f, delimiter=';')
        for myDict in reader:
            print(myDict) # ensemble clé/valeur de chaque ligne
    Si maintenant tu voulais juste les id

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import csv
     
    with open('fichier.csv', 'r') as f:
        reader = csv.DictReader(f, delimiter=';')
        for myDict in reader:
            print(myDict['id']) # tous les ID de chaque ligne
    pratique non ?

    Du coup on peut créer une fonction récupérant la valeur d'une clé pour une ligne précise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import csv
     
    def getDict(filename):
        with open(filename, 'r') as f:
            reader = csv.DictReader(f, delimiter=';')
            for myDict in reader:
                yield myDict
     
    def getValue(sequence, line, keyValue):
        s = list(sequence)
        return s[line][keyValue]
     
    seq = getDict('test.txt')
    print(getValue(seq, 1, 'id')) # valeur du ID ligne 1
    ou même d'autres choses selon les besoins

    Voilà un code possible fait assez rapidement

    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
    import csv
     
    def getDict(filename):
        """Retourne une séquence en mémoire de tous les lignes du fichier
        sous forme clé/valeur"""
        with open(filename, 'r') as f:
            reader = csv.DictReader(f, delimiter=';')
            for myDict in reader:
                yield myDict
     
    def getValue(sequence, line, keyValue):
        "Retourne une valeur spécifique à une ligne précise"
        return sequence[line][keyValue]
     
    def getLine(sequence, line):
        "Retourne une ligne spécifique"
        vals = sequence[line].values()
        return ' '.join(vals)
     
    def getAllLine(sequence):
        "Retourne toutes les lignes du fichier"
        res = []
        for ind, dic in enumerate(sequence):
            res.append(getLine(sequence, ind))
        return '\n'.join(res)
     
    seq = list(getDict('test.txt'))
    print(getAllLine(seq))
    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)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 30
    Points
    30
    Par défaut importer un fichier csv
    merci beaucoup pour votre aide
    le probleme qui m'occupe releve de python et django
    j'essaie de lire un fichier csv et d'ecrire ensuite le contenu dans ma base

    mon modele est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Essai_Temperature(models.Model):
        name = models.ForeignKey(Material, verbose_name=_('name'))                                    .
        nature_unit = models.ForeignKey(Property, verbose_name=_('category'))                      
        choix = ChainedForeignKey(Physic, verbose_name=_('properties'), null=True, blank=True,
                                  related_name='Essai_Temperature_choix',
                                  chained_field="nature_unit",
                                  chained_model_field="name",
                                  show_all=False,
                                  auto_choose=True) 
        valT= models.FloatField(_('temperature'),blank=True, null=False)   
        val10= models.FloatField(_('value'), blank=True, null=False)                                         
        val_ref= models.CharField(_('reference of the data'), max_length=50, default='0')                                               numerique max
    la fonction que j'appelle est definie par

    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
     
    def import_csv(modeladmin, request, queryset):
        import csv, sys
        filename = 'C:/Users/patrice/Documents/base/data50.csv'
        dataReader = csv.reader(open(filename), delimiter=';', quotechar='"')
     
        for row in dataReader:
            try:
     
                essai_temperature = Essai_Temperature()
     
                essai_temperature.name__name = row[1]
                essai_temperature.nature_unit__name = row[2]
                essai_temperature.choix__lapropriete = row[3]
                essai_temperature.valT = float(row[4]) if row[4] is not None else None 
                essai_temperature.val10 = float(row[5]) if row[5] is not None else None
                essai_temperature.val_ref = row[6]
                essai_temperature.save()
     
            except csv.Error as e:
                sys.exit('file %s, line %d: %s' % (filename, dataReader.line_num, e))
     
        dataReader.close()
    lorsque je fais appel a cette fonction j'ai l'erreur suivante :

    Exception Value:

    could not convert string to float: valT ?

    je n'arrive pas a voir pourquoi la conversion ne se fait pas

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ajoute un print au bon endroit du code pour voir la valeur qui ne peut pas être convertie en float. Il suffit qu'il y ait une virgule au lieu d'un point (je ne connais pas django, mais c'est souvent le cas avec Excel).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    C'est juste que la première ligne du fichier CSV contient les titres des champs.

    En utilisant la solution proposée par Fred1599 (DictReader), ce problème ne devrait pas se poser. Sinon il suffit de zapper la première ligne du fichier, mais ce n'est pas une solution élégante, ni fiable. par ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def import_csv(modeladmin, request, queryset):
        import csv, sys
        filename = 'C:/Users/patrice/Documents/base/data50.csv'
        dataReader = csv.reader(open(filename), delimiter=';', quotechar='"')
     
        dataReader.next() #zappe la première ligne 
     
        for row in dataReader:
            try:
                ...
    Pourfendeur de singletons en croisade

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 30
    Points
    30
    Par défaut importer un fichier csv
    en adoptant la solution proposee:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    with open(filename, 'rb') as f:
     
            reader = csv.DictReader(f, delimiter=';')
     
            for row in reader:
                try:
    cette fois, c'est l'erreur :Exception Type: KeyError
    Exception Value: 1

    Le Traceback renvoie la ligne :

    essai_temperature.name = row[1]

Discussions similaires

  1. import de fichier csv
    Par dev7 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/02/2006, 07h23
  2. Import de fichier CSV automatique dans Access
    Par Jmar dans le forum Access
    Réponses: 4
    Dernier message: 20/01/2006, 10h48
  3. Importer un fichier CSV dans un clientdataset ?
    Par mls dans le forum Bases de données
    Réponses: 7
    Dernier message: 15/04/2005, 12h35
  4. [Conseil] Import de fichier CSV vers MySQL
    Par ShinJava dans le forum JDBC
    Réponses: 6
    Dernier message: 15/03/2005, 19h14
  5. Importation de fichier CSV vers une base Interbase
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 15/03/2005, 15h18

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