récupérer les donnees d'un fichier ds 1 tableau python

récupérer les donnees d'un fichier ds 1 tableau python - Python - Programmation

Marsh Posté le 31-03-2008 à 09:27:35    

Bonjour,
Dans la communication serveur client que je traite je veux faire de telle sorte que lorsque le client envoye une commande le serveur lui envoie la réponse appropriée.
 
Les commandes et les réponses appropriées seront stockées dans un fichier .txt.
 
Au démarage du serveur, il doit stocker les données qui se trouvent dans le fichier txt dans un tableau pour faciliter la recherche des commandes en cas où plusieurs clients sont connectés en meme temps et envoyent ces commandes d'une façon disant simultanées.
 
 
Comment le faire? (importation des donnees vers le tableau .....)
Quel code dois-je utiliser?
 
Merci pour votre aide. :jap:

Reply

Marsh Posté le 31-03-2008 à 09:27:35   

Reply

Marsh Posté le 31-03-2008 à 10:45:28    

wat?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 31-03-2008 à 11:25:03    

le probleme tout implement comment mettre des donnees stockées dans un fichier dans un tableau(ou matrice)
ces donnees sont partagées en cmd,reponses

Reply

Marsh Posté le 31-03-2008 à 11:25:34    

file, read, split, csv, ...


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 01-04-2008 à 13:03:30    

voilà, j'ai travaillé dur pour trouver la solution. Tout le monde peut en profiter maintenent.
Voici le code:
 
 
print "recopier un fichier dans le format est chaine#chaine"
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
 
 :hello:

Reply

Marsh Posté le 01-04-2008 à 15:20:51    

tsic a écrit :

voilà, j'ai travaillé dur pour trouver la solution. Tout le monde peut en profiter maintenent.
Voici le code:

 
Code :
  1. fs = open("benj.txt","r" )
  2. ..
  3. for ligne in file("benj.txt" ):



là tu ouvres ton fichier deux fois de suite [:pingouino]

 
Code :
  1. i=0
  2.    c1=""
  3.    c2=""
  4.    while i<len(ligne) and ligne[i]!="#":
  5.        c1=c1+ligne[i]
  6.        i=i+1
  7.  
  8.    i=i+1
  9.    
  10.    while i<(len(ligne)):
  11.        c2=c2+ligne[i]
  12.        i=i+1


C'est censé faire quoi ce truc moche?


Message édité par masklinn le 01-04-2008 à 15:21:07

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 02-04-2008 à 10:03:51    

la premiere boucle c pour recuperer le premiere chaine la deusieme pour la chaine situant après #
Car mon fichier txt est sous la forme:
chaine1#chaine2
cmdClient#repServeur
 

Reply

Marsh Posté le 02-04-2008 à 10:08:03    

tsic a écrit :

la premiere boucle c pour recuperer le premiere chaine la deusieme pour la chaine situant après #
Car mon fichier txt est sous la forme:
chaine1#chaine2
cmdClient#repServeur
 


 [:prozac]

 

http://docs.python.org/dev/library [...] #str.split

 

Au final, ton truc ça doit être l'équivalent d'un truc du style:

Code :
  1. print [line.split('#') for line in file("benj.txt", "r" )]
 

Python c'est pas du C, t'es pas obligé de tout faire à la main tu sais


Message édité par masklinn le 02-04-2008 à 10:10:48

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 02-04-2008 à 10:33:06    

Au fait, ton commentaire en première ligne du script c'est pas du français, et ça ne veut rien dire.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 02-04-2008 à 11:41:29    

ok  
merci
Maintenant c'est le code principal,
C'est le code d'un serveur python. Je veux que lorsque le client envoie une cmd le serveur lui repond le contenue de la case suivante à la case de la liste convenable à sa demande.
Le probleme est que à la 2eme classe de ce code la liste n'est pas identifier de telle sorte qu'à chaque fois que le client envoie sa demande le message envoyé est tjs "cmd erronnee"
aidez moi SVP à trouver la solution.
Merci
 
 
 
Code python :  

Code :
  1. from socket import *
  2. import socket, sys, threading
  3. import SocketServer
  4. import time
  5. import locale
  6.  
  7. class tel():
  8.    
  9.     print "recopier un fichier en eliminant les lignes de remarques"
  10.     fs = open("benj.txt","r" )
  11.     l=[]
  12.  
  13.  
  14.     for ligne in file("benj.txt" ):
  15.         i=0
  16.         c1=""
  17.         c2=""
  18.         while i<len(ligne) and ligne[i]!="#":
  19.             c1=c1+ligne[i]
  20.             i=i+1
  21.  
  22.         i=i+1
  23.    
  24.         while i<(len(ligne)):
  25.             c2=c2+ligne[i]
  26.             i=i+1
  27.    
  28.         l.append(c1)
  29.         l.append(c2.strip())
  30.     fs.close()
  31.     print l
  32.  
  33.  
  34. class GestionnaireEcho(SocketServer.BaseRequestHandler):
  35.  
  36.     def handle(self):
  37.        
  38.         locale.setlocale(locale.LC_ALL,'')
  39.         c= time.strftime('%A %c')
  40.         print "Connexion de ", self.client_address,c
  41.         while True:
  42.             donneesRecues = self.request.recv(8192)
  43.             t=time.strftime("%H:%M:%S" )
  44.             print "\n C ",t, "> ", donneesRecues
  45.             dr=str(donneesRecues)
  46.             try:
  47.                 ind=l.index(dr)
  48.                 print ind
  49.                 msg= str(l[ind+1])
  50.             except:
  51.                 msg="commande erronee"
  52.            
  53.             self.request.send(msg)
  54.            
  55.         print "Deconnexion de ", self.client_address
  56.  
  57.  
  58. mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  59. tel()
  60. try:
  61.     serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
  62. except socket.error:
  63.     print "La liaison du socket a l'adresse choisie a echoue."
  64.     sys.exit()
  65.  
  66. print "En attente..!!!!"
  67.    
  68.  
  69. serveur.serve_forever()


 
pour la classe tel() je vais la changer  comme vous m'avez dit.
mais ça reste pour l'identification de la liste l dans la 2eme classe.

Reply

Marsh Posté le 02-04-2008 à 11:41:29   

Reply

Marsh Posté le 03-04-2008 à 00:48:29    

Déjà un rapide cours sur la programmation objet : http://www.commentcamarche.net/poo/poointro.php3
Car vu la façon dont tu fais tes "classes", je pense qu'un rappel s'impose.
 
Ensuite, normal que tu passe toujours dans l'exception, car ligne 47 tu demande un index sur une liste l qui n'existe pas dans cette classe.
De plus, si ta classe tel ne sert que pour lire ton fichier, tu ferais mieux de la supprimer et de lire le fichier dans le constructeur de ton autre classe. Ce qui résoudrait en plus ton problème avec l, car tu pourrais faire de l un attribut de ta classe.
Ou alors, si tu veux vraiment garder ta classe tel, tu peux mettre ta lecture de fichier dans une méthode statique qui te renvoie ta liste. Et tu appelle cette méthode depuis ton autre classe.


Message édité par _mumu_ le 03-04-2008 à 01:08:27

---------------
"Software is like sex. It's better when it's free..."   Linus Torvalds
Reply

Marsh Posté le 03-04-2008 à 03:25:51    

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 :
  1. from socket import *
  2. import socket, sys, threading
  3. import SocketServer
  4. import time
  5. import locale
  6. class GestionnaireEcho(SocketServer.BaseRequestHandler):
  7.     def _init_(self):
  8.    
  9.         l = []
  10.         for ligne in open('benj.txt'):
  11.             for commande in ligne.split('#'):
  12.                 l.append(commande.strip())
  13.         print l 
  14.         return l
  15.     def handle(self):
  16.         print "la liste est:"
  17.         print l
  18.         locale.setlocale(locale.LC_ALL,'')
  19.         c= time.strftime('%A %c')
  20.         print "Connexion de ", self.client_address,c
  21.         while True:
  22.             donneesRecues = self.request.recv(8192)
  23.             t=time.strftime("%H:%M:%S" )
  24.             print "\n C ",t, "> ", donneesRecues
  25.             dr=str(donneesRecues)
  26.             try:
  27.                 ind=l.index(dr)
  28.                 print ind
  29.                 msg= str(l[ind+1])
  30.             except:
  31.                 msg="commande erronee"
  32.            
  33.             self.request.send(msg)
  34.            
  35.         print "Deconnexion de ", self.client_address
  36. mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  37. try:
  38.     serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
  39. except socket.error:
  40.     print "La liaison du socket a l'adresse choisie a echoue."
  41.     sys.exit()
  42. print "En attente..!!!!"
  43.  
  44. serveur.serve_forever()


 
2)en executant ce code print l de la 2eme classe m'envoie ceci :
-->   <__main__.tel instance at 0x00C3AFA8>
 

Code :
  1. from socket import *
  2. import socket, sys, threading
  3. import SocketServer
  4. import time
  5. import locale
  6. class tel():
  7.     def _call_(self):
  8.         l = []
  9.         for ligne in open('benj.txt'):
  10.             for commande in ligne.split('#'):
  11.                 l.append(commande.strip())
  12.         print l 
  13.         return l
  14. class GestionnaireEcho(SocketServer.BaseRequestHandler):
  15.     def handle(self):
  16.         l=tel()
  17.         print "la liste est:"
  18.         print l
  19.         locale.setlocale(locale.LC_ALL,'')
  20.         c= time.strftime('%A %c')
  21.         print "Connexion de ", self.client_address,c
  22.         while True:
  23.             donneesRecues = self.request.recv(8192)
  24.             t=time.strftime("%H:%M:%S" )
  25.             print "\n C ",t, "> ", donneesRecues
  26.             dr=str(donneesRecues)
  27.             try:
  28.                 ind=l.index(dr)
  29.                 print ind
  30.                 msg= str(l[ind+1])
  31.             except:
  32.                 msg="commande erronee"
  33.            
  34.             self.request.send(msg)
  35.            
  36.         print "Deconnexion de ", self.client_address
  37. mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  38. try:
  39.     serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
  40. except socket.error:
  41.     print "La liaison du socket a l'adresse choisie a echoue."
  42.     sys.exit()
  43. print "En attente..!!!!"
  44.  
  45. serveur.serve_forever()


Où est l'erreur?? j'ai pas compris.
MERCI

Reply

Marsh Posté le 03-04-2008 à 11:06:01    

Pour le 1°, il faut que l soit un attribut de ta classe. Donc tu remplace les lignes 11 à 17 par

Code :
  1. self.l = [ j for i in file("benj.txt", "r" ) for j in i.replace('\n', '').split('#') ]


 
Pour le 2°), pourquoi utilises tu call ?  
Pour les méthodes statiques, va voir cette page : http://www.rexx.com/~dkuhlman/pyth [...] 0000000000


---------------
"Software is like sex. It's better when it's free..."   Linus Torvalds
Reply

Marsh Posté le 03-04-2008 à 11:11:02    

1) Ya deux "_" à __init__ et __call__
2) Fais une fonction à la place de ta classe "tel" (super nom [:icon14]), ou alors apprends à te servir d'une classe
3) Pour ton problème 1, comment fonctionnent les attributs d'une classe
4) T'as des variables qui servent à rien, t'as pas besoin de tout ce qui ya dans le module socket non plus [:fitterashes]  
5) Tu risque d'avoir quelques problèmes avec ton while True [:petrus75]
6) Ça sert à rien de caster des string à tout va, tu sais quand même ce que tu traites non ? [:petrus dei] (hein [:petrus75])
 
Et essaie de faire un effort sur la présentation de ton code, tu t'aideras toi même [:petrus75]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed