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
Bonjour,

Le compilateur Python (version 3.1.3) bloque sur la première ligne, et surligne le dernier '.

if data == 'q' :
         break


Comment l'expliquez-vous ? Quelle est d'ailleurs la différence entre les guillements ordinaires " " et ' ' ?

Merci par avance

6 réponses

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
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
2
lionelronaldo
22 janv. 2011 à 20:00
Merci heyquem
0
lionelronaldo
22 janv. 2011 à 21:55
J'ai donné le code ci-dessous.
0
lionelronaldo
22 janv. 2011 à 22:06
Le message d'erreur précis, c'est "invalid syntax".
0
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.
1
lionelronaldo
22 janv. 2011 à 17:49
Merci drackenshtein
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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 ' '
0
Utilisateur anonyme
23 janv. 2011 à 12:33
vous êtes surs? je crois que j'ai eu l'erreur récemment sur du python entre "" et ''... Mais peut être que je confonds... Dans ce cas je suis absolument désolée...

Edition de mon message pour ne pas laisser une bêtise... Merci d'enlever le +1 si c'est vraiment une bêtise! ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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 ?
1
lionelronaldo
22 janv. 2011 à 20:01
Merci fiddy
0
lionelronaldo
22 janv. 2011 à 20:07
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 :

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 ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0
Alors justement j'avais corrigé ceci en transformant
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 :-(
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
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 :

            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
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 130
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.
1
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é :

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 !
1
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
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.
0
lionelronaldo
23 janv. 2011 à 20:41
Je ne suis pas inscrit, c'est vrai. Ce n'est pas obligatoire.

Oui en effet, le compilateur ne surlignait pas la bonne ligne !

Comment signaler que ce fil est "résolu" ?

Merci à toi
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 janv. 2011 à 20:58
C'est bon, j'ai passé le post en résolu ;-)))
0
lionelronaldo
24 janv. 2011 à 00:38
Merci, comment as-tu fait ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 janv. 2011 à 19:45
Il faut que tu sois inscrit pour pouvoir mettre ton post en résolu.
0