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 :

Lire un fichier txt ligne par ligne


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut Lire un fichier txt ligne par ligne
    Bonjour à tous.
    Je viens à vous car je ne trouve pas de solution malgré pas mal de tentative ...
    Je vous explique mon problème :

    j'ai un fichier txt (maliste.txt) dans le qu'elle se trouve des lignes avec des chiffres.
    voici le contenu :
    1
    22
    794
    96
    34
    .....

    ainsi de suite (très simple)

    Par la suite chaque numéro à un fichier batch associée.
    donc dans le même dossier ou se trouve maliste.txt il y a des fichier .bat qui porte le même nom que ce qu'il y a dans le txt.
    donc 1.bat
    22.bat
    794.bat
    96.bat
    34.bat
    ..........

    j'aimerais exécuter avec un delai de x secondes entre chaque fichier bath l'un à la suite de l'autre.
    Je veux lire la liste qui se trouve dans maliste.txt pour exécuter les fichiers batch.

    en résumé :
    il faut ouvrir les batchs qui se trouve dans maliste.txt

    d'avance merci à vous

  2. #2
    Membre régulier Avatar de Mysti¢
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 155
    Points : 116
    Points
    116
    Par défaut
    Bonjour Pierre,

    Tu peux stocker chaque ligne de ton fichier texte dans un tableau, puis parcourir ce tableau pour ensuite effectuer un traitement spécifique sur chaque entrée.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import os
    tableau = open('maliste.txt', 'r').readlines()
    for element in tableau:
    	os.system(element+'.bat') # Execute le fichier .bat
    Bonne continuation

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    nickel,
    c'était tout simple je pensais à le mettre dans un tableau mais je me suis dit que ça allait pas marché ^^

    par contre la je complique juste un brin la chose.

    donc voici le code que j'ai actuellement.
    Qui fonctionne très bien
    Ca lance bien tout les batchs qui se trouve dans le fichier txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tableau = open("maliste.txt", 'r').readlines()
    for element in tableau:
    	popen('start cmd.exe /K' + element) #Execute le fichier .bat
    mais voila,
    j'aimerais placer un temps d'attente entre le lancement de deux batchs.

    j'ai pensé à inséré ceci dans une boucle if ou autre mais je vois pas du tout comment et ou la placer ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # fonction wait
    for x in range(2,0,-1):
    	print('.')
    	sleep(1)
    en résumé :
    dans le maliste.txt il y a
    1
    2
    8
    15

    je lis le tableau et exécute les batch portant ce nom :
    1.bat
    et la j'aimerais mettre un wait de x secondes
    puis
    2.bat
    wait
    8.bat
    wait
    ........

    merci pour ta réponse ça débloque déjà un peu l'affaire mais sans le wait c'est ingérable car il y a quand même quelques application à lancer ^^ (pas 50 mais une 10ene).

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Il serait peut être plus judicieux d'attendre le code retour de la commande avant de lancer la suivante.
    Vous avez des exemples dans ce sens dans la doc de subprocess.

    Bon code.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    effectivement l'idée est plus logique et bien meilleur finalement.
    par contre je cache pas que je suis complètement largué la ...
    je suis encore débutant en python loin d'être un king.

    pourriez vous me faire un exemple de code avec une fonction wait de 10 secondes ? pour windows bien sur j'utilise python v3.

    merci beaucoup pour votre aide
    j'apprécie vraiment ce forum et la compétence des posters.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par storm85 Voir le message
    pourriez vous me faire un exemple de code avec une fonction wait de 10 secondes ?
    Alors déjà il faut remettre au carat certaines notions.
    La fonction wait() a pour but d'attendre la fin d'un processus. Elle ne permet pas d'attendre un nombre de secondes particulier.
    Pour ça, il faut utiliser la fonction sleep() incluse dans le module time
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
     
    import time
     
    print "hello"
    time.sleep(10)
    print "world"

    Citation Envoyé par storm85 Voir le message
    pour windows bien sur j'utilise python v3.
    Désolé, je suis resté à Python v2 car toutes les librairies que j'utilise n'ont pas encore été portées sous Python v3...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    ho oui j'ai confondu désolé.

    j'ai regardé avec plus d'attention la fonction subprocess mais c'est un peu trop pousser je pense pour mon niveau actuelle.
    j'ai réussi a lancer l'appli mais il fait pas de sleep entre deux appli.

    pourriez vous me montrer un code pour que je m'oriente car j'ai du mal avec le sleep.
    lancer deux appli une derrière l'autre sans soucis mais avec la même ligne de code comme noté au dessus la je cale.

    je sens bien que on n'est pas loin du but

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Si je comprend bien ce que vous voulez c'est exécuter des batch suivant la liste d'un fichier texte et vous ne manipulez pas trop Python.
    Pourquoi ne pas faire cela en batch ? Cela est possible avec call/for/sleep en batch.
    Avez vous vraiment besoin de Python ?

    Bon code.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    au début j'utilisais batch mais plus assez puissant ...
    car je fais d'autre fonction avec python, envoi de mail en cas d'erreur etc ...
    puis je préfère plus python (logique) batch c'est plus du jouet que autre chose.

    je suis pas un gros nul non plus, mais je vois pas trop comment coder et utiliser cette fonction pour faire ce que je veux faire.

    c'est pour ça que je viens à vous

  10. #10
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Et bien cela devrait donner quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import subprocess
    import os
     
    with open("maliste.txt", 'r') as f:
        for elements in [line.strip() for line in f]:
            p = subprocess.Popen("start cmd.exe /K " + elements + ".bat", shell=True)
            sts = os.waitpid(p.pid, 0)[1]
    Bon code

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    ça tourne mais ça n'opère pas bien en fait.
    chaque .bat lance une application (genre dans le .bat il y a un start notepad.exe) ou autre et je suis obligé de passer par un batch (parce que par la suite ce batch lance d'autre appli)

    donc en fait le pid du bath s'ouvre et après être lancé il se ferme donc il n'y pas de wait par le fait que ca prend 1/100 de seconde pour lancer le bat.
    c'est le ou les programmes lancé par le bat qui sont lent et je dois attendre d'avoir chargé tout les programmes d'un bat pour lancer le bat suivant.

    alors il me fait ceci comme erreur quand je place votre code :

    OSError: [Errno 10] No child processes

    donc j'ai ajouter un except :

    voici le code final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with open("maliste.txt", 'r') as f:
        for elements in [line.strip() for line in f]:
            p = subprocess.Popen("start cmd.exe /K " + elements + ".bat", shell=True)
    try:
    	sts = os.waitpid(p.pid, 0)[1]
    except OSError:
    	print("lancement avec erreur")
    else:
    	print("ok c'est passé")
    donc la il me lance bien tout les bat se trouvant dans maliste.txt mais sans aucune pose (logique suite au problème que j'ai noté plus haut).
    donc je pensais au lieu de faire un os.waitpid de faire une time.sleep(10).
    mais je vois pas ou le placer.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 323
    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 323
    Points : 36 837
    Points
    36 837
    Par défaut
    Salut,
    Pourquoi ne pas ajouter /WAIT à START pour qu'il attende la fin de l'exécution de la commande avant de terminer?
    - W

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    j'ai essayé avec start /WAIT.
    la commande dos reste bien ouverte temps que l'applic est open (ça m'intéresse pas plus que ça mais bon).
    malgré ça il me renvoi l'erreur et ouvre les appli en même temps ...

    c'est pas au niveau des batch qu'il y a a coder je pense.

    pour moi faudrait arriver à dire a python tu lance une appli puis tu attends x secondes avant de lancer la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    try:
    	sts = os.waitpid(p.pid, 0)[1]
    genre ça devrait être un truc comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    try:
    	sts = time.sleep(os.waitpid(p.pid, 0)10)[1]
    sauf que bon la c'est mal codé car je vois pas comment coder ça ^^
    c'est si compliqué ce bête petit truc ?

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 323
    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 323
    Points : 36 837
    Points
    36 837
    Par défaut
    Oops, l'indentation ne me plait pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with open("maliste.txt", 'r') as f:
        for elements in [line.strip() for line in f]:
            p = subprocess.Popen("start cmd.exe /K " + elements + ".bat", shell=True)
            try:
    	    sts = p.wait()   # utilisons l'interface existante
            except OSError:
    	    print("lancement avec erreur")
            else:
    	    print("ok c'est passé") 
                sleep(10) # <---
    Et j'ai ajouté une attente
    - W

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    Et j'ai ajouté une attente
    - W
    ou ? dans les batch la fonction /wait ?

    j'ai essayé le code mais il me sort une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    D:\python\test\racine\run>run_test.py
      File "D:\python\test\racine\run\run_test.py", line 32
        sts = p.wait()   # utilisons l'interface existante
                                                                       ^
    TabError: inconsistent use of tabs and spaces in indentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    with open("maliste.txt", 'r') as f:
        for elements in [line.strip() for line in f]:
            p = subprocess.Popen("start cmd.exe /K " + elements + ".bat", shell=True)
            try:
    	    sts = p.wait()   # utilisons l'interface existante
            except OSError:
    	    print("lancement avec erreur")
            else:
    	    print("ok c'est passé") 
                sleep(10) # <---
    pourtant j'ai respecté l'indentation.
    c'est vrai que comme ça le code est plus juste mais la il me fait une belle petite erreur (je rappel que je suis sous python v3).

    en tous cas merci pour le temps que vous consacrez à mon cas (qui à l'air vraiment particulier) ...

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    et bin je ne comprends vraiment pas pourquoi ça ne fonctionne pas... =(
    j'espère que quelqu'un va trouver la solution à mon problème

    vous pouvez essayer le code chez vous et voir d'ou vient l'erreur.

    merci et j'espère que on va arriver à la fin de ce problème

  17. #17
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    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 subprocess
    from time import sleep
     
    with open("maliste.txt", 'r') as f:
        for elements in [line.strip() for line in f]:
            p = subprocess.Popen("start cmd.exe /K " + elements + ".bat", shell=True)
            try:
                sts = p.wait()
            except OSError:
                print("lancement avec erreur")
            else:
                print("ok") 
                sleep(10)
    Mais le sleep n'est pas la bonne solution par rapport au contenu des batch.
    Un wait dans les start du batch n'est t'il pas plus approprié ?

    @+

    Edit :
    A vrais dire il existe une solution, celle de lire le bat et d'exécuter les commandes une à une. Cela se trouve sur le forum avec les discutions sur une 'console' en python.
    C'est bien trop lourd par rapport à la simple modification du bat lui même.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    avec le wait le problème persiste.
    Je pense que il va falloir attaquer le problème autrement.

    Je résumer comment ça fonctionne.

    maliste.txt > xxx.bat
    dans le fichier xxx.bat se trouve une ligne de commande : start /MIN monprog.exe
    Monprog.exe ne doit pas s'arrêter il tourne tout le temps.

    Donc si je place un /WAIT dans le bat, il ne s'arrêtera jamais vu que monprog.exe doit constamment fonctionner.

    Dans le même dossier se trouve maliste.txt et tout les fichier .bat
    C'est à partir de la lecture de maliste.txt que les bat doivent être lancé.

    Je pensais à une opération tout autre.
    Créer une boucle qui lit ligne par ligne le fichier maliste.txt

    Donc j'imagine ceci :

    ouvre maliste.txt
    lancement de la boucle
    lit la ligne 1
    exécute la commande pour la ligne 1 (comme noté plus haut dans les postes)
    sleep(10)
    ajoute +1 pour passer à la ligne suivante (/n)
    et revient au début de la boucle

    et une fois arrivé a la dernière ligne l'opération est finie.

    Pour moi c'est la solution la plus propre pour exécuter les opérations et plus besoin de récupérer des PID ou autre .

    Quand pensez vous ?

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 323
    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 323
    Points : 36 837
    Points
    36 837
    Par défaut
    Salut,
    Ce que vous racontez s'écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import subprocess
    from time import sleep
     
    with open("maliste.txt", 'r') as f:
        for elements in [line.strip() for line in f]:
            try:
               p = subprocess.Popen("start cmd.exe /K " + elements + ".bat", shell=True)
            except OSError:
                print("lancement avec erreur")
            else:
                print("ok") 
                sleep(10)
    Et si çà ne le fait pas, c'est peut être parce que votre histoire est plus compliquée que vous ne le racontez.
    - W

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 224
    Points
    224
    Par défaut
    Salut,
    Heu... si « l'erreur » est toujours celle-ci :
    Citation Envoyé par storm85 Voir le message
    j'ai essayé le code mais il me sort une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    D:\python\test\racine\run>run_test.py
      File "D:\python\test\racine\run\run_test.py", line 32
        sts = p.wait()   # utilisons l'interface existante
                                                                       ^
    TabError: inconsistent use of tabs and spaces in indentation
    C'est juste que ton fichier python mélange les espaces et les tabulations, ce que python n'aime pas (mais alors pas du tout).
    Peut-être utiliser la fonction du style « remplacer les tabulations par des espaces » que tout bon éditeur de code python se doit d'avoir pourrait régler le problème.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2003] lire une table Access en VBA ligne par ligne
    Par afifaNancy dans le forum VBA Access
    Réponses: 6
    Dernier message: 25/06/2012, 13h54
  2. Lire un fichier txt champ par champ
    Par than24 dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 23/02/2010, 09h59
  3. lire fichier .txt (NOTEPAD) ligne par ligne
    Par skambram dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/06/2009, 18h41
  4. Comment lire un fichier txt ligne par ligne ?
    Par Chikh001 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 20/11/2007, 09h27
  5. lire un fichier .txt ligne par ligne
    Par 7awela dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 07/06/2007, 17h02

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