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

Réseau/Web Python Discussion :

recherche d'1 chaine ds un fichier txt en python


Sujet :

Réseau/Web Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut recherche d'1 chaine ds un fichier txt en python
    Bonjour,
    aidez moi SVP c très urgent.
    J'etouffe
    Donc voilà mon code je veux que lorsque le client envoie une cmd existante dans le tableau le serveur lui repond la reponse qui est mise à la case l[i+1] de la case de reponse située dans l[i]. Je ne sais pas pourquoi quand je tape la chaine il me répond tjs le message écrit dans l'exception. les fichies seront à votre disposition.
    Vous pouvez les tester sous dos.
    le fichier c:\python25\benj.txt voilà son contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jj#oo
    bg#cd
    azerty#qwerty
    bs#bn
    le fichier serveur:

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    from socket import *
    import socket, sys, threading
    import SocketServer
    import time
    import locale
     
    class tel():
     
        print "recopier un fichier en eliminant les lignes de remarques"
        fs = open("benj.txt","r")
        l=[]
     
     
        for ligne in file("benj.txt"):
            i=0
            c1=""
            c2=""
            while i<len(ligne) and ligne[i]!="#":
                c1=c1+ligne[i]
                i=i+1
     
            i=i+1
     
            while i<(len(ligne)):
                c2=c2+ligne[i]
                i=i+1
     
            l.append(c1)
            l.append(c2.strip())
        fs.close()
        print l
     
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
     
        def handle(self):
     
            locale.setlocale(locale.LC_ALL,'')
            c= time.strftime('%A %c')
            print "Connexion de ", self.client_address,c
            while True:
                donneesRecues = self.request.recv(8192)
                t=time.strftime("%H:%M:%S")
                print "\n C ",t, "> ", donneesRecues
                dr=str(donneesRecues)
                try:
                    ind=l.index(dr)
                    print ind
                    msg= str(l[ind+1])
                except:
                    msg="commande erronee"
     
                self.request.send(msg)
     
            print "Deconnexion de ", self.client_address
     
     
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tel()
    try:
        serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
    except socket.error:
        print "La liaison du socket a l'adresse choisie a echoue."
        sys.exit()
     
    print "En attente..!!!!"
     
     
    serveur.serve_forever()
    le fichier client:

    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
    57
    58
    # Definition d"un client reseau gerant en parallele l'emission
    # et la reception des messages (utilisation de 2 THREADS).
     
    host = '127.0.0.1'
    port = 84
     
    import socket, sys, threading
     
    class ThreadReception(threading.Thread):
        """objet thread gerant la reception des messages"""
        def __init__(self, conn):
            threading.Thread.__init__(self)
            self.connexion = conn           # ref. du socket de connexion
     
        def run(self):
            while 1:
                message_recu = self.connexion.recv(1024)
                print "Ser>" + message_recu 
     
            # Le thread <reception> se termine ici.
            # On force la fermeture du thread <emission> :
     
            print "Client arrete. Connexion interrompue."
            self.connexion.close()
     
    class ThreadEmission(threading.Thread):
     
        """objet thread gerant l'emission des messages"""
        def __init__(self, conn):
            threading.Thread.__init__(self)
            self.connexion = conn           # ref. du socket de connexion
     
        def run(self):
            message_final=""
            while 1:
                message_final=""
                message_emis = raw_input()
                message_final = message_final + " \n "+ message_emis
                self.connexion.send(message_final)
     
     
     
    # Programme principal - etablissement de la connexion :
    connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        connexion.connect((host, port))
    except socket.error:
        print "La connexion a echoue."
        sys.exit()    
    print "Connexion etablie avec le serveur."
     
    # Dialogue avec le serveur : on lance deux threads pour gerer
    # independamment l'emission et la reception des messages :
     
    th_E = ThreadEmission(connexion)
    th_R = ThreadReception(connexion)
    th_E.start()
    th_R.start()

    Merci

  2. #2
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    Salut,
    je crois que j'ai su l'erreur.
    c'est dans le niveau de l'appelle de la liste l dans la deuxieme classe.
    Cette classe ne reconnais pas la liste.
    Dans comment faire pour qu'elle en reconnais.

  3. #3
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    la variable l n'est visible que localement dans la classe tel() (qui ressemble plus à fonction qu'à une classe)
    ce qu'il te faut, c'est que d'une manière ou d'une autre l passe dans handle :
    - soit tu fais une variable globale (bof)
    - soit tu appelles tel depuis Handle :
    -> tu transformes tel en fonction retournant l
    -> et dans le handle

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    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 841
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cboudy Voir le message
    ...classe tel() (qui ressemble plus à fonction qu'à une classe)
    C'est assez exact...
    Citation Envoyé par cboudy Voir le message
    -> tu transformes tel en fonction retournant l
    -> et dans le handle
    Ou si vraiment tu veux garder ta classe tel, tu y rajoutes la méthode "__call__(self):" qui retourne juste l et tu fais comme l'a dit cboudy =>
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    Je suis totalement convaicue par vos idées merci
    Mais lorsque j'ai essayé de les appliquer voilà ce que c'est passé:
    1)une erreur pour ce code disant que variable globale l est inexistante ou manquante:

    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
     
    from socket import *
    import socket, sys, threading
    import SocketServer
    import time
    import locale
     
     
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
        def _init_(self):
     
            l = []
            for ligne in open('benj.txt'):
                for commande in ligne.split('#'):
                    l.append(commande.strip())
            print l   
            return l
     
     
        def handle(self):
            print "la liste est:"
            print l
            locale.setlocale(locale.LC_ALL,'')
            c= time.strftime('%A %c')
            print "Connexion de ", self.client_address,c
            while True:
                donneesRecues = self.request.recv(8192)
                t=time.strftime("%H:%M:%S")
                print "\n C ",t, "> ", donneesRecues
                dr=str(donneesRecues)
                try:
                    ind=l.index(dr)
                    print ind
                    msg= str(l[ind+1])
                except:
                    msg="commande erronee"
     
                self.request.send(msg)
     
            print "Deconnexion de ", self.client_address
     
     
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
    try:
        serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
    except socket.error:
        print "La liaison du socket a l'adresse choisie a echoue."
        sys.exit()
     
    print "En attente..!!!!"
     
     
    serveur.serve_forever()
    2)en executant ce code print l de la 2eme classe m'envoie ceci :
    --> <__main__.tel instance at 0x00C3AFA8>

    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
    from socket import *
    import socket, sys, threading
    import SocketServer
    import time
    import locale
     
    class tel():
        def _call_(self):
            l = []
            for ligne in open('benj.txt'):
                for commande in ligne.split('#'):
                    l.append(commande.strip())
            print l   
            return l
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
     
        def handle(self):
            l=tel()
            print "la liste est:"
            print l
            locale.setlocale(locale.LC_ALL,'')
            c= time.strftime('%A %c')
            print "Connexion de ", self.client_address,c
            while True:
                donneesRecues = self.request.recv(8192)
                t=time.strftime("%H:%M:%S")
                print "\n C ",t, "> ", donneesRecues
                dr=str(donneesRecues)
                try:
                    ind=l.index(dr)
                    print ind
                    msg= str(l[ind+1])
                except:
                    msg="commande erronee"
     
                self.request.send(msg)
     
            print "Deconnexion de ", self.client_address
     
     
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
    try:
        serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
    except socket.error:
        print "La liaison du socket a l'adresse choisie a echoue."
        sys.exit()
     
    print "En attente..!!!!"
     
     
    serveur.serve_forever()
    Où est l'erreur?? j'ai pas compris.
    J'ai une question qui peut sembler un peu débile mais puisque je suis débutante en python: On met _init_ avec un seul tiré bas ou deux __init__? Et est ce que ceci est important?

    Merci

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par tsicc Voir le message
    J'ai une question qui peut sembler un peu débile mais puisque je suis débutante en python: On met _init_ avec un seul tiré bas ou deux __init__? Et est ce que ceci est important?
    C'est bien avec 2 blancs soulignés avant et après (__init__).

    Et oui, c'est important. Je te suggère d'étudier un peu les mécanismes d'héritage.

    Quand tu déclares la classe avec "class GestionnaireEcho(SocketServer.BaseRequestHandler):", tu crées en fait une classe dérivée de "SocketServer.BaseRequestHandler" qui va hériter de son contenu. La méthode __init__ sert à initialiser ta nouvelle classe, et elle sera automatiquement exécutée lors de la création de l'instance (=affectation à une variable). Mais elle doit aussi faire le lien avec la classe parente par un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SocketServer.BaseRequestHandler.__init__(...)
    Inspire toi de l'exemple ici:

    http://www.oreillynet.com/onlamp/blo...ketserver.html

    Tyrtamos

Discussions similaires

  1. rechercher les champs BDD dans des fichiers .txt
    Par twixi dans le forum Linux
    Réponses: 6
    Dernier message: 16/03/2009, 13h20
  2. Recherche d'une chaine dans un fichier distant
    Par nitramm dans le forum ASP
    Réponses: 3
    Dernier message: 20/08/2008, 16h49
  3. Recherche d'une phrase dans un fichier txt
    Par beegees dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/07/2007, 08h44
  4. [code]Recherche d'une chaine dans des fichiers
    Par guillaume_pays_ceven dans le forum Contribuez
    Réponses: 5
    Dernier message: 21/06/2007, 14h32
  5. [MFC] Chaine dans un fichier txt
    Par le-makinero dans le forum MFC
    Réponses: 5
    Dernier message: 21/04/2006, 10h10

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