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 :

Formater un fichier pour l'exploiter


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut Formater un fichier pour l'exploiter
    Bien le bonjours à tout les adorateur de python !

    Je dois déployer dans ma boite, psshutdown qui permet l'extinction des postes Windows à distance. Cela permettrais de réaliser des économie d'énergie
    C'est un programme qui requier simplement, le nom ou l'ip des machines le tout dans un fichier texte, et il s'occupe du reste.

    Seulement, j'aimerais évoluer la chose, car le script serais déployer sur de nombreuses machines
    Je m'explique

    Je récupère le nom des machines concerné dans l'Active Directory (par l'intermédiaire d'un script batch, car je n'ai pas trouver comment faire avec python).
    Un fichier par Unité d'Organisation (exemple: pc_secteur1.txt, pc_secteur2.txt ....)
    Je concatène les différents fichiers en un seul, en ajoutant le secteur auquel il apartiènne sur la ligne de forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "nom_de_la_machine1";"secteur"
    "nom_de_la_machine2";"secteur"
    "nom_de_la_machine3";"secteur"
    Jusqu'a là tout va bien

    J'aimerais pouvoir travailler avec ce fichier, et rajouter des chose sur les ligne que je désire, seulement j'ai l'impression de prendre le mauvais chemin.

    Mon but serais de faire des ping sur les machines de tout le fichier et d'ajouter le résultat (OK ou KO) de forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "nom_de_la_machine1";"secteur";"ping1";"ping2";"ping3"
    "nom_de_la_machine2";"secteur";"ping1";"ping2";"ping3"
    "nom_de_la_machine3";"secteur";"ping1";"ping2";"ping3"
    Seulement je ne sais pas comment ecrire mes résultat sur les lignes désirés.
    Cela me permétrais de travailler avec un fichier formaté

    Aussi quand je fait un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Fichier = open('pctest.txt', 'a')
     
    t = Fichier.readline(13)
    print t
     
    t = obFichier.readline(13)
    print t
    Il ne me prend pas les 13 caractères ou du moins il fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "nom_de_la_machine1"
    ;"secteur";
    au lieux de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "nom_de_la_machine1"
    "nom_de_la_machine2"
    "nom_de_la_machine3"
    Je vais dejà m'arréter là pour mes problèmes
    En vous remerciant d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    Pour lire ton fichier je te propose la syntaxe suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    line=Fichier.readline()  #Lecture de la ligne de ton fichier
    while 1:   #Boucle infini
        if line=="":          #Si on fini le fichier, on sort de la boucle
            break 
        else:
            line=line[0:-1] #On se debarasse du charactere "Fin de ligne (\n)"
            liste=line.split(";") #Creation d'une liste contenant les différents élément de ta ligne séparé par un ;
            print liste[0]
            line=Fichier.readline()  #Lecture de la ligne de ton fichier
    A chaque passage de la boucle while tu aura donc une liste avec le format de donnée suivant:
    [nom_machine,secteur] (et eventuellement plus si tu ajoute des infos a chaque ligne)

    (ici on imprimera simplement le nom de la machine pour toutes les lignes du fichier)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Whouaahh niquel ju_bicycle

    Tout simplement ton bout de code marche Niquel !! (je vai sle garder au chaud)
    Je n'aurais pas pensé à prendre le problème sous cet angle.

    Donc au final "liste" deviens un tableau ?"

    Comment ajouter des information sur une ligne alors ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    liste[3].write("pingOK")
    Me retourne out of the range (normal).

    Si je ping un nom de machine, j'aimerais que le script inscrive à la suite de la ligne OK ou NOK (grace à une fonction que j'ai écrie)

    Je ne comprend pas comment travailler avec "liste", car quand j'appel celui-ci il me retourne la totalité du fichier, et donc l'impossibilité de travailler ligne par ligne

    Par la suite il faudra que j'éclate le fichier en plusieurs partis pour permettre des ping parallèle car beaucoup de machine (j'ai bien dit par la suite )

    Pardonne moi mon noobisme, mais je découvre python et c'est l'une des première fois ou je travaille avec un fichier formaté

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    hello
    Donc au final "liste" deviens un tableau ?"
    Oui tout a fait: Ici j'ai utilisé la méthode "split" qui transforme une chaine de caractère en liste en utilisant comme caractère séparateur celui que tu met entre guillemet.
    (Il y a énormément de méthode super intéressante sur les listes et les chaines de caractère je t'invite a te renseigner dessus ca aide énormément)


    liste[3].write("pingOK")
    ATTENTION 2 erreurs dans ta ligne:

    Primo python commence a compter a partir de 0, donc si tu veux toucher le troisième membre du tableau, il faut faire liste[2]

    Secundo pour l'instant liste n'a que 2 éléments, tu ne peut donc pas aller modifier le troisieme (puisqu'il n'existe pas). Heureusement il existe la méthode "append" qui permet d'ajouter un élément a une liste (illustrer plus bas)
    Je réitere mon conseil de te renseigner sur les possibilités liés aux listes et aux chaine. Le tuto de Swinnen (pages 128 et 133) donne un petit aperçu des méthodes dispos

    Pour ajouter de l'info maintenant:
    Ca dépend de ce que tu veux faire. Je propose un p'tit truc tout con: La méthode "join"
    C'est un peu le symétrique de la split: elle transforme une liste en une chaine de caractere en séparant les élément par le caractere de ton choix. Elle s'utilise comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "LE CARACTERE SEPARATEUR".join(LA LISTE A TRANSFORMER)
    ex ",".join(ma_liste)
    Ce qui donne pour ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    liste.append("Ton info")  #on ajoute a la liste l'info que tu veux ajouter
    line_to_write=";".join(liste) #utilisation de la méthode join
    Fichier.write(line_to_write)  #ecriture de la ligne dans le fichier texte
    PS: Attention dans mon code précédent, si ta derniere ligne n'est pas suivit d'un retour chariot, tu perd le dernier caractere...

  5. #5
    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 ne sais pas si c'est cela que tu veux, mais je pense que dans ton cas il faut utiliser la méthode insert concernant une liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste.insert(3, liste[3]+" pingOK") # 3 étant le n° index, sachant que le n° index commence à 0 et pas 1
    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)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2007
    Messages : 105
    Points : 145
    Points
    145
    Par défaut
    Bonjour,

    Juste une question au passage, il y a des tableaux dans python ?!?
    Moi qui croyait que c'étaient des listes ...

    Salutations.

    PS: Pour ajouter des éléments à la fin d'une liste, on peut utiliser la méthode append.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Je te tien au jus demain, quand j'aurais tout mon temps, ça à l'air de fonctionner en tout cas.
    Thx

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Merci pour vos info, j'avance à petit pas...
    Aprés quelque test j'ai des doute quand à la création de la liste à la lecture du fichier car:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print liste
    ['"nom_de_la_machine"', '"lieux"']
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print liste [0]
    "nom_de_la_machine"
    Alors qu'il devrais me retourner le nom de toute mes machine non ? Il me faudrais une liste machine, et une liste lieux ?
    J'avoue être un peut pommé là.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    Oui dans le code que je t'ai filé, il créé une nouvelle liste a chaque fois.
    Maintenant si tu veux on peut créer une liste avec le format suivant:

    [
    [Nom de machine,Secteur]
    [Nom de machine,Secteur]
    ...
    [Nom de machine, Secteur]
    ]

    Autrement dit chaque élément de la liste contiendra une sous liste avec le nom de la machine et son secteur
    Ca te vas??

    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
     
    # -*- coding:Latin-1 -*-
     
    fichier=open('machine.txt','r')
     
    line=fichier.readline()  #Lecture de la ligne de ton fichier
    liste_complete=[]        #Liste qui contiendra la totalité des informations
    while 1:   #Boucle infini
        if line=="":          #Si on fini le fichier, on sort de la boucle
            break 
        else:
            line=line[0:-1] #On se debarasse du charactere "Fin de ligne (\n)"
            liste=line.split(";") #Creation d'une liste contenant les différents élément de ta ligne séparé par un ;
            liste_complete.append(liste)  #Ajout de ces éléments dans la liste totale
            line=fichier.readline()  #Lecture de la ligne de ton fichier
    #Lecture des différents element de la liste
    for element in liste_complete:
        print "Nom de machine: ",element[0]
        print "Nom de secteur: ",element[1]

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    C'est exactement ce que je cherchais, j'allais aller dans cette voix, mais tu m'a fait gagné énormement de temps, je t'en remercie

    D'ailleur je croie que ça à répondu aussi à la question de "aepli" .

    Maintenant il me reste à exploiter tout ça, et travailler entre les liste en mémoire, et mon fichier.

    Il faut que je trouve une bonne méthode de ping, car j'en aurais une 20ene en parallèle.
    Je te tien au jus de l'avancement de mon programme,

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    Il se trouve que j'ai devellopé un truc en python pour (entre autre) pinger et sauvegarder le résultat de ca dans un fichier texte
    (Attention sous linux uniquement)
    Si ca t'interesse fais moi signe

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Oui tes source peuvent m'interesser, elle doivent être moin cracra que les mienne voici ce que j'ai fait pour ping

    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
     
    #Ping
    ok = 0
    nok = 0
    reg_ping_ok = 0
    cap_ping_ok = 0
    ftr_ping_ok = 0
    reg_ping_nok = 0
    cap_ping_nok = 0
    ftr_ping_nok = 0
    for i in liste_complete :
        ip = "ping -n 3 " + i[0]
        p = os.system(ip)
        print p,i[0]
        if (p == 0 ):
            print "ping OK"
            ok += 1
            i.append('"1"')
            if i[1] == '"reg"':
                reg_ping_ok += 1
            elif i[1] == '"cap"':
                cap_ping_ok += 1
            else:
                ftr_ping_ok += 1
     
        else:
            print "ping NOK"
            nok += 1
            i.append('"0"')
            if i[1] == '"reg"':
                reg_ping_nok += 1
            elif i[1] == '"cap"':
                cap_ping_nok += 1
            else:
                ftr_ping_nok += 1
     
    print ok,'qui on repondu dont ',reg_ping_ok,' de la region ',cap_ping_ok,' de capitolas et' ,ftr_ping_ok,' du ftrc '
    print nok,'qui ne reponde pas dont ',reg_ping_nok,'de la region',cap_ping_nok, ' de capitolas et ', ftr_ping_nok, 'du ftrc'
    c'est pas ce qu'il y à de plus portable, et c'est pas très beau

    Quand les ping sont fini, j'ai bien l'état qui ce rajoute dans la liste (0 ou 1), pour tout les postes pingué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    print liste_complete
     
    [['"nom_poste"', '"reg"', '"1"'], ['"nom_poste"', '"reg"', '"0"']]
    Maintenant c'est de le rajouter dans le fichier texte, avec les fonction que tu m'a filé ça devrais aller

    T'es astuces m'ont pas mal avancées, python est vraiment puissant

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    le prob de mes sources c'est que c'est sous linux, et ca utiliser des commande batch...
    Effectivement je t'ai filé la méthode pour écrire la liste dans le fichier
    (méthode Join)
    @+

    PS: Si tu as les réponses a tes questions, hésite pas a cliquer "Resolu" en bas de la pages

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Ouai c'est vrai, que pour faire un ping portable, le mieux est de coder la fonction avec les socket, ou de ce servir d'un module python qui fait ça.
    Ca dois exister

    Je commence à me débrouiller avec les liste.

    Par contre avec la methode join, je n'arrive pas à ecrire mon résultat de ping ligne par ligne dans mon fichier texte.

    J'extrai bien de ma liste, l'information désiré, que j'ecrie bien dans mon fichier texte, mais pas à l'endroit voulu.

    Il me met tout à la fin, et sans saut de ligne (normal, faut que je trouve la parade)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        obFichier = open('pcglobal.txt','a')
        for i in liste_complete :
     
            line_to_write=";".join(i[2])      #utilisation de la méthode join
            obFichier.write(line_to_write)  #ecriture de la ligne dans le fichier texte
     
        obFichier.close()
    La forme désiré serais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "nom_de_la_machine1";"secteur";"0"
    "nom_de_la_machine2";"secteur";"1"
    et non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "nom_de_la_machine1";"secteur"
    "nom_de_la_machine2";"secteur"
    ";0;"";1;"

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    line_to_write=";".join(i[2]) #utilisation de la méthode join
    Le probleme est dans le "2"
    Il faut joiner toutes la sous-liste, donc ici "i"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    line_to_write ";".join(i)      #utilisation de la méthode join
    Ce devrait aller

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    J'ai au final contourner ce probléme par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def ecritureListe(fichier_sortie):
        obFichier = open(fichier_sortie,'w')
        for i in liste_complete :
            line_to_write=";".join(i)  
            print line_to_write
            obFichier.write(line_to_write+'\n')  
        obFichier.close()
        return
    J'ecrie la liste, par dessu mon fichier ou ce trouve les "nom_des_machine";"secteur" à chaque session de ping.
    Vu que la liste ce remplie, plus qu'a ecraser le fichier et copier la totalité de la liste sur le fichier

    C'est bourin hein

    Que le python te bénisse !

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Salut !

    Juste un petit message pour ajouter 2 choses :

    1. pour dialoguer avec ActiveDirectory, je te conseille... active_directory.py !
    Tu trouveras sur le site un petit cookbook sur comment l'utiliser : trouver un ou tous les utilisateurs, trouver un ordinateur, etc. Je ne connais pas bien ActiveDirectory, je te laisse donc regarder par toi-même, mais il m'a été très utile pour un programme "one-shot".
    Pour son installation, il va falloir aussi installer pywin32 (qui est excellent par lui-même, te permettant de lire/écrire des fichiers Word, Excel, Access, etc.)

    2. Pour ta lecture/écriture de fichier, je te conseille d'utiliser le module csv qui est dans la librairie standard de Python.

    Par exemple, avec un fichier spam.csv qui contient les lignes suivantes :
    1;2;3
    spam;eggs;ham
    42;holy grail

    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
     
    >>> import csv
     
    # Lecture d'un fichier csv
    >>> reader = csv.reader(open('spam.csv'), delimiter=';')
     
    # Lecture ligne par ligne
    >>> for line in reader:
    ...    print line
    ['1', '2', '3']
    ['spam', 'eggs', 'ham']
    ['42', 'holy grail']
     
    # Récupération de la totalité du fichier sous forme d'une liste
    >>> input = list(csv.reader(open('spam.csv'), delimiter=';'))
    >>> input
    [['1', '2', '3'], ['spam', 'eggs', 'ham'], ['42', 'holy grail']]
     
     
    # Ecriture dans un fichier
    >>> output = [[10, 9, 8], ['trucs', 'sans', 'importance']]
     
    # Ecriture ligne par ligne
    >>> w = csv.writer(open('eggs.csv', mode='w'), delimiter=';')
    >>> for line in output:
    ...    w.writerow(line)
     
    # Ecriture d'un seul bloc
    >>> wbis = csv.writer(open('ham.csv', mode='w'), delimiter=';')
    >>> w.writerows(output)
     
    # Vérification des écritures
    >>> list(csv.reader(open('eggs.csv'), delimiter=';'))
    [[10, 9, 8], ['trucs', 'sans', 'importance']]
    >>> list(csv.reader(open('ham.csv'), delimiter=';'))
    [[10, 9, 8], ['trucs', 'sans', 'importance']]
    L'erreur qui m'est souvent arrivée (et qui m'arrive encore quelquefois) est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    >>> reader = csv.reader('spam.txt') # Oubli de la fonction open !
    >>> for line in reader:
    >>>     print line
    's'
    'p'
    'a'
    'm'
    '.'
    't'
    'x'
    't'
    # Ouch !
    Attention, ce code ne ferme pas les fichiers ouverts, tu auras donc une alerte Excel si tu les ouvres alors que tu as tapé ces commandes dans une session interactive toujours ouverte.
    Le problème ne se pose toutefois pas si tu exécutes ces commandes dans un script, la fin du script libérant les variables et donc fermant les fichiers.

    Mais la bonne manipulation d'un fichier devrait toujours se faire avec les méthodes open et close, ou alors (mieux, mais uniquement dispo depuis la 2.6, voire la 2.5 avec "from __future__ import with_statement") avec le context manager with/as (à aller regarder dans la doc officielle python).

    Bon code !

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Merci nardo47 pour les info, le module csv est intéressant pour formater des fichier pour de petit projet !

    Je viens de tester le module active_directory.py (car j'avais eu quelque problème pour la mettre en place) et ça marche niquel

    A la base j'utilise la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dsquery computer -name Poste* -o rdn -limit 0 "OU=xx,OU=xx,OU=xx,OU=xx,DC=xx,DC=xx,DC=xx,DC=xx" > fichier.txt
    Cela me permet de récuprérer tout les nom de machine commencent par "Poste" et m'envoie la liste dans fichier.txt
    Mais il faut que les outils d'administration de l'active directory soit installé.

    J'ai par contre une erreur dans une condition

    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 active_directory,time,os
    tps1 = time.clock()
     
    i = 0
    y = 0
     
    computers = active_directory.AD_object ("LDAP://ou=xx,ou=xx,ou=xx,ou=xx,dc=xx,dc=xx,dc=xx,dc=xx")
     
    for computer in computers.search (objectCategory='computer'):
        i = i + 1
        if (computer.cn[:5] == "Poste") & (len(computer.cn) == '11'):
            y = y + 1
     
    tps2 = time.clock()
    print tps2 - tps1
     
    print i
    print y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        if (computer.cn[:5] == "Poste") & (len(computer.cn) == '11'):
            y = y + 1
    Cette condition ne fonctionne que pour la longueur de la chaine, quand je lui demande de faire un test de longueur de chaine en plus sur "computer.cn" cela ne fonctionne pas, mon compteur y est toujours à 0, sachant que la plupart des "computer.cn" font 11 caractère quand je fait un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print len(computer.cn)
    11

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Ah !

    Essaie plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    # On laisse tomber les parenthèses et on lie les tests avec "and".
    # L'opérateur & est utilisé pour faire un ET bit à bit.
    if computer.cn[:5] == 'Poste' and len(computer.cn) == 11:
    M'est avis que c'est la comparaison entre la longueur du nom d'ordi et '11' (avec guillemets) qui fait que ça ne marche pas.
    Si ça ne marche toujours pas, il faudra regarder "à la main" si les tests sont corrects :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for computer in computers.search (objectCategory='computer'):
        cn = computer.cn
        print cn, cn[:5] == 'Poste', len(cn) == 11
    et regarder le nombre de lignes qui se termine par 'True True'.
    S'il n'y en a aucune, c'est que tes tests ne sont pas corrects.

    Sinon, pour info, je viens de me prendre la tête avec de l'encodage de chaînes de caractères et le responsable est le module csv !
    Donc, si tu as des caractères accentués dans ton fichier, laisse tomber le module csv (c'est peut-être corrigé dans Python 3.0, à confirmer).

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 99
    Points : 93
    Points
    93
    Par défaut
    Tout simplement:



    Ca marche niquel !!!

    J'ai grandement avancé mon code grâce à ton aide (à cause du low skill que j'ai sur ce language )

    Bonne continuation, et @ bientot sur le fofo

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

Discussions similaires

  1. Format de fichier pour Kdenlive
    Par spiwis dans le forum SUSE
    Réponses: 0
    Dernier message: 16/11/2013, 21h26
  2. format de fichier pour LOAD DATA INFILE
    Par triaguae dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/06/2010, 17h51
  3. quels format de fichiers pour l'animation DirectX
    Par korsakoff69 dans le forum DirectX
    Réponses: 6
    Dernier message: 06/07/2009, 22h44
  4. Réponses: 3
    Dernier message: 12/10/2005, 13h53
  5. Quel format de fichier utiliser pour les maps ?
    Par fb57 dans le forum OpenGL
    Réponses: 3
    Dernier message: 23/09/2004, 20h22

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