String en Python
Résolu/Fermé
lionelronaldo
-
22 janv. 2011 à 17:28
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 24 janv. 2011 à 19:45
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 24 janv. 2011 à 19:45
A voir également:
- String en Python
- Citizen code python avis - Accueil - Outils
- Vli product string - Forum Matériel & Système
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Executer un programe python dans la console ✓ - Forum Python
6 réponses
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 22/01/2011 à 18:51
Modifié par heyquem le 22/01/2011 à 18:51
Bonjour,
À ma connaissance, il n'y a pas de différence entre l'utilisation de " et celle de ' pour les chaînes, même en Python 3.
Les deux sont des délimiteurs de chaînes et c'est bien pratique pour écrire par exemple:
"il l'a pris"
'Zinedine, dit "Zizou", ne joue plus'
Pour le reste je ne serai pas aussi affirmatif car je n'utilise que Python 2 et la représentation des chaînes est différente en Python 3, pour lequel les chaînes sont toutes Unicode de base.
En Python 2, il n'y a pas de types séparés chaîne et caractère, un caractère est une chaîne de longueur 1:
The items of a string are characters. There is no separate character type; a character is represented by a string of one item.
https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy
En Python 3, je ne suis pas sûr de pourvoir affirmer la même chose, on retrouve pas la même formulation dans la doc de Python 3.
Mais je trouve assez bizarre l'idée qu'il y ait un type char et un type str en Python 3 et qu'on ne puisse pas comparer les deux. C'est à mon avis faux, on doit pouvoir écrire data = 'q' oû data sera une chaîne
En Python 3, il y a des petites choses qui changent dans la yntaxe. Peut être Python 3 exige-t-il des parenthèses autour du test, alors que ce n'est pas le cas en Python 2....:
if (data == 'q'):
????
Est-ce que data est bien une chaîne ? Tu dervais faire print type(data) pour vérifier son type.
Il faudrait aussi que tu montres le message d'erreur, ce serait mieux pour comprendre.
Sinon , en l'état, je donne ma langue au chat
À ma connaissance, il n'y a pas de différence entre l'utilisation de " et celle de ' pour les chaînes, même en Python 3.
Les deux sont des délimiteurs de chaînes et c'est bien pratique pour écrire par exemple:
"il l'a pris"
'Zinedine, dit "Zizou", ne joue plus'
Pour le reste je ne serai pas aussi affirmatif car je n'utilise que Python 2 et la représentation des chaînes est différente en Python 3, pour lequel les chaînes sont toutes Unicode de base.
En Python 2, il n'y a pas de types séparés chaîne et caractère, un caractère est une chaîne de longueur 1:
The items of a string are characters. There is no separate character type; a character is represented by a string of one item.
https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy
En Python 3, je ne suis pas sûr de pourvoir affirmer la même chose, on retrouve pas la même formulation dans la doc de Python 3.
Mais je trouve assez bizarre l'idée qu'il y ait un type char et un type str en Python 3 et qu'on ne puisse pas comparer les deux. C'est à mon avis faux, on doit pouvoir écrire data = 'q' oû data sera une chaîne
En Python 3, il y a des petites choses qui changent dans la yntaxe. Peut être Python 3 exige-t-il des parenthèses autour du test, alors que ce n'est pas le cas en Python 2....:
if (data == 'q'):
????
Est-ce que data est bien une chaîne ? Tu dervais faire print type(data) pour vérifier son type.
Il faudrait aussi que tu montres le message d'erreur, ce serait mieux pour comprendre.
Sinon , en l'état, je donne ma langue au chat
Utilisateur anonyme
Modifié par drackenshtein le 23/01/2011 à 12:33
Modifié par drackenshtein le 23/01/2011 à 12:33
En C
" " indique une chaine de caractères
' ' indique un caractère seul
Edit : apparemment pour Python pas de différence
je ne vois pas par contre pourquoi le compilateur bloque dessus. data peut contenir plusieurs caractères?
peut être un problème de type...
Je crois qu'en comparaisons de caractères ou de chaines le "==" n'est pas toujours approprié car il compare bit à bit.
" " indique une chaine de caractères
' ' indique un caractère seul
Edit : apparemment pour Python pas de différence
je ne vois pas par contre pourquoi le compilateur bloque dessus. data peut contenir plusieurs caractères?
peut être un problème de type...
Je crois qu'en comparaisons de caractères ou de chaines le "==" n'est pas toujours approprié car il compare bit à bit.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 janv. 2011 à 18:33
22 janv. 2011 à 18:33
" " indique une chaine de caractères
' ' indique un caractère seul
Tu confonds avec le C probablement. Ici c'est du Python. Et il n'y a pas de différence entre " " et ' '
' ' indique un caractère seul
Tu confonds avec le C probablement. Ici c'est du Python. Et il n'y a pas de différence entre " " et ' '
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
23 janv. 2011 à 14:10
23 janv. 2011 à 14:10
Ah oui, je suis sûr. La différence est à l'utilisation. Lorsque tu souhaites écrire une phrase avec des apostrophes, tu utiliserais plutôt les guillemets et réciproquement. Mais au-delà de la différence d'utilisation, le résultat est identique.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 janv. 2011 à 18:45
22 janv. 2011 à 18:45
Bonjour,
Pas de différence entre " " et ' '.
As-tu bien fait attention à l'indentation ?
Comment lances-tu ton programme ? Via : python programme.py
ou via : programme.py ?
Dans ce dernier cas, as-tu bien mis l'entête ?
Pas de différence entre " " et ' '.
As-tu bien fait attention à l'indentation ?
Comment lances-tu ton programme ? Via : python programme.py
ou via : programme.py ?
Dans ce dernier cas, as-tu bien mis l'entête ?
A l'origine de ma question, il y a un code trouvé sur un forum internet, et qui ne fonctionne pas chez moi. Le forum en question n'ayant pas l'air très actif, j'ai préféré poser ma question sur commentcamarche.net.
Donc voici le code :
Je l'ai enregistré sous un fichier serveur_pythonforum.py. Et ensuite dans IDLE, j'ai cliqué sur "Run Module" (F5).
Le programme fonctionne-t-il chez vous ?
Donc voici le code :
from socket import * import string from time import ctime HOST = '' PORT = 1001 BUFSIZ = 1024 ADDR = (HOST, PORT) ssock = socket(AF_INET, SOCK_STREAM) ssock.bind(ADDR) ssock.listen(5) try: while True: c = 1 print 'Waiting for a connection...' csock, addr = ssock.accept() hostname, aliases, addresses = gethostbyaddr(addr[0]) lip, lport = ssock.getsockname() print ''' Connected ... Remote Host : %s Remote host IP : %s Remort Port : %d Connected time : %s Local IP : %s Local Port : %d \n''' % (hostname , addr[0], addr[1], ctime(), lip, lport) while True: data = csock.recv(BUFSIZ) if data == 'q': break elif data == 'shut': ssock.close() break elif data == ' ': csock.send('Server Responce: <> \n') print 'srv responces: %d : <>' % c c += 1 else: data1 = data.upper() csock.send('Server Responce: %s \n' % data1) print 'srv responces: %d : <%s>' % (c, data1) c += 1 csock.close() except: print 'Server socket closed !!!'
Je l'ai enregistré sous un fichier serveur_pythonforum.py. Et ensuite dans IDLE, j'ai cliqué sur "Run Module" (F5).
Le programme fonctionne-t-il chez vous ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 janv. 2011 à 20:26
22 janv. 2011 à 20:26
Ce programme est conçue pour une version antérieure à Python 3.
Par exemple print 'coucou' marche en python 2.X mais pas en python 3. La syntaxe est devenue print('coucou')
Essaie avec une version antérieure de python.
Par exemple print 'coucou' marche en python 2.X mais pas en python 3. La syntaxe est devenue print('coucou')
Essaie avec une version antérieure de python.
Alors justement j'avais corrigé ceci en transformant
en
Mais je n'ai pas réussi à corriger
J'ai moi aussi soupçonné un problème de version car un autre programme que j'avais écrit moi-même en Python, il y a environ 5 ans, ne fonctionne plus :-(
print 'Waiting for a connection...'
en
print('Waiting for a connection...')
Mais je n'ai pas réussi à corriger
if data == 'q': break
J'ai moi aussi soupçonné un problème de version car un autre programme que j'avais écrit moi-même en Python, il y a environ 5 ans, ne fonctionne plus :-(
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 janv. 2011 à 23:42
22 janv. 2011 à 23:42
Supprime ta ligne : if data=='q': complètement.
Et réécris là. Par fois, il y a des espaces qui sont codés différemment et qui fait crier l'interprêteur.
Et réécris là. Par fois, il y a des espaces qui sont codés différemment et qui fait crier l'interprêteur.
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
22 janv. 2011 à 23:17
22 janv. 2011 à 23:17
J'ai beau chercher, je ne vois pas de syntaxe mal écrite.
Ce que je pense , c'est que csock.recv(BUFSIZ) ne renvoie pas une chaîne.
Il faudrait que tu insères une ligne pour afficher des renseignements sur data :
Je n'ai pas a possibilité de regarder moi-meme le résultat car ce programme est un programme de réception d'un message via soket. Or personne n'est censé m'envoyer un message par socket. Il faudrait que je crée et lance un programme qui envoie un message par socket de et vers mon propre ordinateur, mais je ne connais pas suffisamment les sockets.
Tu devrais aussi enlever les deux lignes qui posent problème, pour voir si celui-ci se déplace sur if data == 'shut' ou si a le fait disparaître :
Ce que je pense , c'est que csock.recv(BUFSIZ) ne renvoie pas une chaîne.
Il faudrait que tu insères une ligne pour afficher des renseignements sur data :
data = csock.recv(BUFSIZ) print 'type(data)==',type(data) print 'len de data==',len(data) print 'data==',data if data == 'q': break
Je n'ai pas a possibilité de regarder moi-meme le résultat car ce programme est un programme de réception d'un message via soket. Or personne n'est censé m'envoyer un message par socket. Il faudrait que je crée et lance un programme qui envoie un message par socket de et vers mon propre ordinateur, mais je ne connais pas suffisamment les sockets.
Tu devrais aussi enlever les deux lignes qui posent problème, pour voir si celui-ci se déplace sur if data == 'shut' ou si a le fait disparaître :
data = csock.recv(BUFSIZ) print 'type(data)==',type(data) print 'len de data==',len(data) print 'data==',data if data == 'shut': ssock.close() break elif data == ' ': csock.send('Server Responce: <> \n') print 'srv responces: %d : <>' % c c += 1
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 23/01/2011 à 16:02
Modifié par heyquem le 23/01/2011 à 16:02
« Ce que je pense , c'est que csock.recv(BUFSIZ) ne renvoie pas une chaîne. »
Idée idiote:
socket.recv(bufsize[, flags])
Receive data from the socket. The return value is a string representing the data received.
https://docs.python.org/3/library/socket.html#socket.socket.recv
À part ça,
j'ai spécifié HOST = 'localhost' à la place de HOST = '' et inséré une ligne
print '\ndata :',type(data),' de len',len(data),' :\n',data
dans le code de socket serveur que tu avais donné,
j'ai créé un autre code pour jouer le rôle de socket client avec la même spécification HOST = 'localhost' ,
et j'ai obtenu une réception de données par le socket serveur
qui n'a pas produit d'erreur au niveau de if data == 'q': break
lionelronaldo,
étant donné qu'il n'est pas possible de reproduire l'erreur, que tu joues au fantôme sur CCM et que le code que tu avais posté a disparu (!?) , je me désintéresse de ce sujet.
Idée idiote:
socket.recv(bufsize[, flags])
Receive data from the socket. The return value is a string representing the data received.
https://docs.python.org/3/library/socket.html#socket.socket.recv
À part ça,
j'ai spécifié HOST = 'localhost' à la place de HOST = '' et inséré une ligne
print '\ndata :',type(data),' de len',len(data),' :\n',data
dans le code de socket serveur que tu avais donné,
j'ai créé un autre code pour jouer le rôle de socket client avec la même spécification HOST = 'localhost' ,
et j'ai obtenu une réception de données par le socket serveur
qui n'a pas produit d'erreur au niveau de if data == 'q': break
lionelronaldo,
étant donné qu'il n'est pas possible de reproduire l'erreur, que tu joues au fantôme sur CCM et que le code que tu avais posté a disparu (!?) , je me désintéresse de ce sujet.
Dans Python 3, il faut faire attention à ce que print soit bien une fonction (i.e. il faut rajouter des parenthèses). On en avait déjà parlé plus haut mais j'avais oublié des parenthèses à un moment. Maintenant ça marche. Voici le code corrigé :
Autre nouveauté de Python 3, raw_input a été remplacée par input. J'ai aussi dû jouer avec encode() et decode().
Merci à tous, drackenshtein, heyquem et fiddy. J'espère n'en oublier aucun !
from socket import * import string from time import ctime HOST = '' PORT = 1044 BUFSIZ = 1024 ADDR = (HOST, PORT) ssock = socket(AF_INET, SOCK_STREAM) ssock.bind(ADDR) ssock.listen(5) try: while True: c = 1 print('Waiting for a connection...') csock, addr = ssock.accept() hostname, aliases, addresses = gethostbyaddr(addr[0]) lip, lport = ssock.getsockname() print(''' Connected ... Remote Host : %s Remote host IP : %s Remort Port : %d Connected time : %s Local IP : %s Local Port : %d \n''' % (hostname , addr[0], addr[1], ctime(), lip, lport)) while True: data = csock.recv(BUFSIZ) if data == 'q': break elif data == 'shut': ssock.close() break elif data == ' ': csock.send('Server Responce: <> \n') print('srv responces: %d : <>' % c) c += 1 else: data1 = data.upper() csock.send('Server Responce: %s \n' % data1) print('srv responces: %d : <%s>' % (c, data1)) c += 1 csock.close() except: print('Server socket closed !!!')
Autre nouveauté de Python 3, raw_input a été remplacée par input. J'ai aussi dû jouer avec encode() et decode().
Merci à tous, drackenshtein, heyquem et fiddy. J'espère n'en oublier aucun !
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
23 janv. 2011 à 17:50
23 janv. 2011 à 17:50
Tiens je croyais que tu avais disparu.
Comment se fait il que tu arrives à poster des questions et des réponses alors que tu n'es pas inscrit comme membre ? :
- ton pseudo en grisé et non pas en bleu=lien
- https://www.commentcamarche.net/communaute/profil-lionelronaldo
Cet utilisateur n'est pas membre de CommentCaMarche.net !
------------------------------------
Bon, il semble que le problème soit résolu. Je ne voyais plus quoi faire d'autre.
J'en conclus la chose suivante:
- en Python 2, quand il y a une erreur , c'est parfois à propos de la ligne suivante que l'interpréteur signale une erreur. Il faut regarder alors au dessus de la ligne dénoncée
- j'y avais pensé pour ton erreur, mais il semble qu'avec Python 3, le piège se soit accru. C'est apparemment parce qu'il manquait les parenthèses dans l'instruction print plusieurs lignes plus haut qu'une erreur était signalé sur if data == 'q', à tort. Ça doit tenir à la complexité accrue de ce qu'est capable de faire print dans Python 3.
Eh ben , je ne savais pas ! Encore appris quelque chose aujourd'hui.
Merci pour l'information.
Comment se fait il que tu arrives à poster des questions et des réponses alors que tu n'es pas inscrit comme membre ? :
- ton pseudo en grisé et non pas en bleu=lien
- https://www.commentcamarche.net/communaute/profil-lionelronaldo
Cet utilisateur n'est pas membre de CommentCaMarche.net !
------------------------------------
Bon, il semble que le problème soit résolu. Je ne voyais plus quoi faire d'autre.
J'en conclus la chose suivante:
- en Python 2, quand il y a une erreur , c'est parfois à propos de la ligne suivante que l'interpréteur signale une erreur. Il faut regarder alors au dessus de la ligne dénoncée
- j'y avais pensé pour ton erreur, mais il semble qu'avec Python 3, le piège se soit accru. C'est apparemment parce qu'il manquait les parenthèses dans l'instruction print plusieurs lignes plus haut qu'une erreur était signalé sur if data == 'q', à tort. Ça doit tenir à la complexité accrue de ce qu'est capable de faire print dans Python 3.
Eh ben , je ne savais pas ! Encore appris quelque chose aujourd'hui.
Merci pour l'information.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
23 janv. 2011 à 20:58
23 janv. 2011 à 20:58
C'est bon, j'ai passé le post en résolu ;-)))
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
24 janv. 2011 à 19:45
24 janv. 2011 à 19:45
Il faut que tu sois inscrit pour pouvoir mettre ton post en résolu.
22 janv. 2011 à 20:00
22 janv. 2011 à 21:55
22 janv. 2011 à 22:06