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 :

Tester le type d'une variable [Python 2.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Avatar de sroux
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Points : 516
    Points
    516
    Par défaut Tester le type d'une variable
    Bonjour,

    Je débute en Jython, car utilisé comme langage de script pour une application métier, et je m'arrache les cheveux pour tester le type de 2 colonnes. Cela afin de ne pas prendre la ligne en compte s'il s'agit d'un entête (donc colonnes de type string). Tous les fichiers soumis n'ayant pas forcément d'entête...

    J'utilise le bout de code suivant qui ne semble pas fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if isinstance(column[7], (int, long, float, complex)) and isinstance(column[8], (int, long, float, complex)):
    Par ailleurs j'ai le message, non bloquant, suivant :
    IndexError : index out of range: 7

    Données en entrée dans un fichier :

    LegalEntity;LedgerAccount;AccountLabel;IntercoCode;TransactionCurrency;InternalReference;ExternalReference;AmountCurrency;TransactionAmount
    306;A410105;Trade debtors and related accounts - Group;100;USD;CLOSE14;CLOSE14;208841.15;983785.63
    306;A410105;Trade debtors and related accounts - Group;100;USD;EXV-000427;EXV-000427;0.00;-123924.51
    306;A410105;Trade debtors and related accounts - Group;200;USD;EXV-000466;EXV-000427;1000;-123
    ...

    Mon programme :

    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
    import shutil
     
    infilename = "c:/temp/Intercompany_306_2015010.csv"
    outfilename = "c:/temp/Intercompany_306_2015010.OUT.csv"
     
    infile = open(infilename, "r")
    outfile = open(outfilename, "w")
     
    for line in infile:
     
    	column = line.split(';',9)
     
    	#Si numérique alors on prend en compte
    	if isinstance(column[7], (int, long, float, complex)) and isinstance(column[8], (int, long, float, complex)):
    		outfile.write(column[0] + ";" + column[1] + ";" + column[2] + ";" + column[3] + ";None;" + column[5] + ";" + column[6] + ";" + column[7] + "\n")
    		if column[8] != column[7]:
    			outfile.write(column[0] + ";" + column[1] + ";" + column[2] + ";" + column[3] + ";" + column[4] + ";" + column[5] + ";" + column[6] + ";" + column[8])
     
    infile.close()
    Merci d'avance pour votre éclairage!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    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 351
    Points : 36 875
    Points
    36 875
    Par défaut
    Salut,

    Citation Envoyé par sroux Voir le message
    Je débute en Jython, car utilisé comme langage de script pour une application métier, et je m'arrache les cheveux pour tester le type de 2 colonnes. Cela afin de ne pas prendre la ligne en compte s'il s'agit d'un entête (donc colonnes de type string). Tous les fichiers soumis n'ayant pas forcément d'entête...
    Lorsque vous lisez un fichier, les lignes sont des chaînes de caractères.
    Et le découpage d'une ligne via .split va fabriquer une liste de chaînes de caractères.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> line = "306;A410105;Trade debtors and related accounts - Group;100;USD;CLOSE
    14;CLOSE14;208841.15;983785.63"
    >>> column = line.split(';', 9)
    >>> column
    ['306', 'A410105', 'Trade debtors and related accounts - Group', '100', 'USD', '
    CLOSE14', 'CLOSE14', '208841.15', '983785.63']
    >>> column[7]
    '208841.15'
    >>>
    Donc isinstance(column[7], (int, long, float, complex)) ne fonctionnera jamais.
    Par contre, vous pourriez appliquer float ou int à la chaîne de caractère et attraper l'erreur via try... except...
    Il faut juste prendre le temps d'ouvrir un tuto. pour apprendre les bases de la programmation avec Python.

    - W

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Bonsoir,

    le mieux serait déjà d'utiliser la librairie native CSV, ça fait gagner du temps sur l'écriture du parser.

    Ensuite pour tester si c'est un texte qu'on peut convertir en nombre malheureusement il n'y a pas tout, str.isdecimal()
    Il faut donc le créer:

    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
    def is_int_float_complex(string): # {
        try:
            int(string)
            return True
        except ValueError: pass
        try:
            float(string)
            return True
        except ValueError: pass
        try:
            complex(string)
            return True
        except ValueError: pass
        return False
    # }
    is_int_float_complex("5") sera vrai
    is_int_float_complex("5.5") sera vrai
    is_int_float_complex("5+5j") sera vrai

    Pour ce qui est de l'exception/erreur IndexError cela veut dire qu'on a tenté d'accéder à un élément qui n'existe pas, cela veut dire que la ligne n'était pas de la bonne longueur espérée, autant s'en assurer avant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if len(line) != 9: continue # Saute la ligne si la taille n'est pas de 9 colonnes
    Voici un exemple complet, mais ne connaissant pas la donnée d'entrée il faudra sans doutes revoir les conditions.
    notamment les deux if sur le test des colonnes 7 et 8, faut-il tester deux fois la même ligne ou est-ce un si, sinon si qu'il faut ? Dans ce cas il faut utiliser la syntaxe:

    if condition1: bla
    elif condition2: blabla

    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
    53
    54
    55
    56
    # -*- coding: utf-8 -*-
    # Python 2&3
     
    import csv # CSV File Reading and Writing https://docs.python.org/library/csv.html
     
    infilename = "Intercompany_306_2015010.csv"
    outfilename = "Intercompany_306_2015010.OUT.csv"
     
    def is_int_float_complex(string): # {
        try:
            int(string)
            return True
        except ValueError: pass
        try:
            float(string)
            return True
        except ValueError: pass
        try:
            complex(string)
            return True
        except ValueError: pass
        return False
    # }
     
    try: # {
        infile = outfile = None
        infile = open(infilename, mode='r')
        outfile  = open(outfilename, mode='w')
        in_csv = csv.reader(infile, delimiter=";")
        out_csv = csv.writer(outfile, delimiter=";", lineterminator="\n")
     
        for line in in_csv: # {
            if in_csv.line_num == 1: # Première ligne du fichier
                out_csv.writerow(line) # On l'enregistre telle quelle ?
                continue
            if len(line) != 9: continue # Saute la ligne si la taille n'est pas de 9 colonnes
            # Si numérique alors on prend en compte
            if is_int_float_complex(line[7]) and is_int_float_complex(line[8]): # {
                out_csv.writerow([
                    line[0],
                    line[1],
                    line[2],
                    line[3],
                    "None",
                    line[5],
                    line[6],
                    line[7],
                ])
                #continue # ?
            # } if
            # À continuer
        # } for
    # } try
    finally:
        if infile: infile.close()
        if outfile: outfile.close()

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

Discussions similaires

  1. Tester le type d'une variable de type "Variant"
    Par nono27200 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/08/2007, 21h26
  2. Tester le type d'une variable
    Par jmbonnaz dans le forum MATLAB
    Réponses: 2
    Dernier message: 29/06/2007, 17h37
  3. tester le type d'une variable
    Par MayOL69bg dans le forum Langage
    Réponses: 5
    Dernier message: 16/04/2007, 14h31
  4. Tester le type d'une variable
    Par Débéa dans le forum Général Python
    Réponses: 2
    Dernier message: 03/08/2006, 16h45
  5. Tester le type d'une variable
    Par mzt.insat dans le forum Linux
    Réponses: 5
    Dernier message: 30/05/2006, 18h37

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