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 :

TypeError: 'str' does not support the buffer interface


Sujet :

Python

  1. #1
    Membre actif
    Avatar de Thomas404
    Homme Profil pro
    dev
    Inscrit en
    Novembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2009
    Messages : 99
    Points : 234
    Points
    234
    Par défaut TypeError: 'str' does not support the buffer interface
    Bonjour tout le monde, alors j'apprend python(3)

    Mais j'ai un problème, je cherche à faire un programme qui traduise un texte normal, en binaire, puis qu'il l'écrive dans un fichier. hors, quand j'essaye je me retrouve face à ca :

    TypeError: 'str' does not support the buffer interface

    voici mon code.

    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
     
    import os
     
    print("Programme permettant de traduire une str en b.\n")
    f=open('text2.txt','w')
     
    while 1:
        mot=input("Dire: ")
        f.write(mot)
        if mot=='':
            break
            f.close()
     
    f=open('text2.txt','rb')
    octets=f.read()
    f.close()
     
    f=open('text2.txt','wb')
    for oct in octets:
        f.write("{}".format(str(oct)))
        f.close()
    alors j'ai essayer à l'avant derniere ligne sans le "str(oct)" ...
    ca m'affiche :

    TypeError: 'int' does not support the buffer interface

  2. #2
    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 que vous donne une recherche sur le web à propos de cette erreur ?
    Que comprenez vous (ou pas) des explications trouvées ?
    Sortez de votre histoire de fichier et testez avec la conversion d'une chaîne de caractère: bin > str, str > bin. Puis passez à votre 'for'.

    @+

    Ps: Bien que sans rapport oct est un mots réservé par le langage.
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Bonsoir,

    Moi je me demande ce que vous appelez un "fichier binaire". A voir votre code, c'est un fichier qui contient les codes ASCII (ou d'un autre encodage) des chiffres qui représentent les codes ASCII (ou d'un autre encodage) d'un texte...

    Dans l'usage normal, un fichier binaire est simplement un fichier qui ne contient pas (uniquement) des caractères affichables. Pour le système, un fichier texte et un fichier binaire sont identiques. Ce qui distingue les deux, c'est leur contenu, et, au niveau de l'API, le traitement des fins de lignes (principalement).

    Donc "traduire un fichier texte en fichier binaire" n'a pas beaucoup de sens pour moi.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    EDIT : j'utilise Python 2.7 alors que le PO utilise Python 3.x. Comme montré par PauseKawa dans la suite de ce sujet, il y a des différences notables entre ces versions de Python pour la gestion de chaines, rendant le code pas forcément portable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while 1:
        mot=input("Dire: ")
        f.write(mot)
        if mot=='':
            break
            f.close()
    Le break a lieu avant le f.close() donc le fichier ne sera pas refermé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f=open('text2.txt','wb')
    for oct in octets:
        f.write("{}".format(str(oct)))
        f.close()
    Le fichier est refermé à chaque tour de boucle, alors qu'il n'est ouvert qu'une seule fois. L'écriture échouera dés la 2e itération de la boucle.

    Le but du fichier est, comme dit par les précédents posteurs, étrange ^^ Dans IDLE, une fois le script terminé, je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> type(octets)
    <type 'str'>
    Donc la boucle de fin transforme chaque caractère texte en une chaine de caractère. Sauf qu'en Python, il n'y a pas de différences entre char et string comme on peut l'avoir dans d'autres langages. str(oct) et oct sont donc identiques, comme le montre le code suivant qui affichera toujours "Obvious" :
    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
    import os
     
    print("Programme permettant de traduire une str en b.\n")
    f=open('text2.txt','w')
     
    while 1:
        mot=raw_input("Dire: ") # remplacer par input si Python 3.x
        f.write(mot)
        if mot=='':
            break
            print "Jamais exécuté"
     
    f.close()
     
    f=open('text2.txt','rb')
    octets=f.read()
    f.close()
     
    f=open('text2.txt','wb')
     
    for oct in octets:
        #f.write("{}".format(str(oct)))
        if oct == str(oct) :
            print "Obvious"
        else :
            print "Caché !"
     
    f.close()
    A tout hasard, le lien suivant peut être utile : http://sebsauvage.net/python/charsets_et_encoding.html

    @+

    PS : je n'ai pas rencontré l'erreur indiquée, mais je n'utilise pas Python 3...

  5. #5
    Membre actif
    Avatar de Thomas404
    Homme Profil pro
    dev
    Inscrit en
    Novembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2009
    Messages : 99
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    ...
    Merci je vais essayer.

    Citation Envoyé par dividee Voir le message
    Bonsoir,

    Moi je me demande ce que vous appelez un "fichier binaire". A voir votre code, c'est un fichier qui contient les codes ASCII (ou d'un autre encodage) des chiffres qui représentent les codes ASCII (ou d'un autre encodage) d'un texte...
    Oui je me suis tromper de terme, c'est ca en fait .

    Citation Envoyé par Bktero Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while 1:
        mot=input("Dire: ")
        f.write(mot)
        if mot=='':
            break
            f.close()
    Le break a lieu avant le f.close() donc le fichier ne sera pas refermé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f=open('text2.txt','wb')
    for oct in octets:
        f.write("{}".format(str(oct)))
        f.close()
    Le fichier est refermé à chaque tour de boucle, alors qu'il n'est ouvert qu'une seule fois. L'écriture échouera dés la 2e itération de la boucle.

    Le but du fichier est, comme dit par les précédents posteurs, étrange ^^ Dans IDLE, une fois le script terminé, je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> type(octets)
    <type 'str'>
    Donc la boucle de fin transforme chaque caractère texte en une chaine de caractère. Sauf qu'en Python, il n'y a pas de différences entre char et string comme on peut l'avoir dans d'autres langages. str(oct) et oct sont donc identiques, comme le montre le code suivant qui affichera toujours "Obvious" :
    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
    import os
     
    print("Programme permettant de traduire une str en b.\n")
    f=open('text2.txt','w')
     
    while 1:
        mot=raw_input("Dire: ") # remplacer par input si Python 3.x
        f.write(mot)
        if mot=='':
            break
            print "Jamais exécuté"
     
    f.close()
     
    f=open('text2.txt','rb')
    octets=f.read()
    f.close()
     
    f=open('text2.txt','wb')
     
    for oct in octets:
        #f.write("{}".format(str(oct)))
        if oct == str(oct) :
            print "Obvious"
        else :
            print "Caché !"
     
    f.close()
    A tout hasard, le lien suivant peut être utile : http://sebsauvage.net/python/charsets_et_encoding.html

    @+

    PS : je n'ai pas rencontré l'erreur indiquée, mais je n'utilise pas Python 3...
    Peut-être que mon erreur vien justement du fait qu'il n'y a pas de difference entre str et oct ? Je vais voir, merci.

    Merci je vais essayer

    Merci je ne savais pas pour le break


    En fait je veux faire ca juste pour voir si ça marche ... Si je peux transformer mes lettres en chiffres et qu'ils soient sauvegarder dans un fichier texte. Plus tard j'essayerais la même chose mais à la place des chiffres mettre des symboles(que je définirais moi même probablement).

    En fait ca sert surtout à m'entrainer à utiliser les instructions de fichiers, 'for' et autres... vue que j’apprends il me faut bien des petit trucs à faire

    Je ne connaissait pas le site de sebsauvage, il va m'être utile je pense.

    edit : je vien de voir que dans mon livre ils abordent ce sujet dans les pages suivantes...

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    http://stackoverflow.com/questions/2...cter-in-python
    Je présume que c'est cela que tu souhaites faire : remplacer 'a' par '97' ? Si oui, voici un exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    texte = raw_input("Texte : ")
     
    if not texte :
        print "Vide"
    else :
        for char in texte:
            print "{} --> {}".format(char, ord(char))
     
    print "Et voila"
    Merci je ne savais pas pour le break
    De rien Il y a un comportement similaire avec les return et autre continue.

    Dans tous les cas, je présume que ton fichier reste un fichier texte, dont le contenu est lisible avec Word ? Si oui, tu n'as pas à l'ouvrir en mode binaire, mais en mode "normal".

  7. #7
    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
    Juste une note ou deux:
    Le PO parle de Python 3.
    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
    patrice@Zeus:~/Bureau$ /usr/bin/python2.6
    Python 2.6.7 (r267:88850, Aug 11 2011, 12:16:10) 
    [GCC 4.6.1] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> w = b'ABC'
    >>> w == str(w)
    True
    >>> quit()
    patrice@Zeus:~/Bureau$ /usr/bin/python3.2
    Python 3.2.2 (default, Sep  5 2011, 22:09:30) 
    [GCC 4.6.1] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> w = b'ABC'
    >>> w == str(w)
    False
    Maintenant le souci ne viens pas que de là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> f = open("tt", "wb")
    >>> f.write('toto')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'str' does not support the buffer interface
    @+
    Merci d'utiliser le forum pour les questions techniques.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Oh ! OK. Python 3 modifie la gestion des chaines de bases, j'en avais entendu parlé. PEP parlant de ça : http://docs.python.org/release/3.0.1....html#pep-3112


    J'ai installé Python dans ma VM Debian (et Debian power donc Python 3.1) :
    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
    >>> f = open("/home/pierre/test.txt","rb")
    >>> contenu = f.read()
    >>> type(contenu)
    <class 'bytes'>
    >>> str(contenu)
    "b'bonjour pierre\\n'"
    >>> contenu
    b'bonjour pierre\n'
    >>> cb = str(contenu)
    >>> cb == contenu
    False
    >>> type(cb)
    <class 'str'>
    >>> type(contenu)
    <class 'bytes'>
    En revanche, je n'ai pas le même message d'erreur que toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> f.close()
    >>> f = open("/home/pierre/test.txt","wb")
    >>> f
    <_io.BufferedWriter name='/home/pierre/test.txt'>
    >>> f.write("toto")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: must be bytes or buffer, not str
    EDIT : voila qui devrait faire l'affaire ^^


    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
    pierre@debian:~$ python3
    Python 3.1.3 (r313:86834, Nov 28 2010, 11:28:10) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> f = open("/home/pierre/test.txt","wb")
    >>> s = "bonjour developpez"
    >>> type(s)
    <class 'str'>
    >>> f.write(s)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: must be bytes or buffer, not str
    >>> f.write(s.encode())
    18
    >>> f.close()
    >>> len(s)
    18
    Mon fichier contient bien mes caractères.

    Qu'en penses-tu ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 54
    Points
    54
    Par défaut
    Bonjour,
    Tu veux écrire dans un fichier en mode binaire et tu écris un str, ces 2 objets n'ont pas les memes interfaces, essaye d'encoder ton str en bytes (avec la méthode encode())

  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,

    Nous voila donc ou je voulais vous amener en parlant de conversion: le type de donné utilisé.
    Contrairement à Python 2 ou un open(path, 'wb') nous donne un objet de type file Python 3 nous donne une instance _io.BufferedWriter (voir open en Python 3). Vous devez donc utiliser un type qu'il 'comprend'.
    Vous retrouvez cela avec l'erreur de Bktero:
    >>> f
    <_io.BufferedWriter name='/home/pierre/test.txt'>
    >>> f.write("toto")
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: must be bytes or buffer, not str
    Note:
    Il y a parfois des 'surprises'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> s = b"ABC"
    >>> for o in s:
    ...     print(o, type(o))
    ... 
    65 <class 'int'>
    66 <class 'int'>
    67 <class 'int'>
    Merci d'utiliser le forum pour les questions techniques.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Merci pour les précisions PauseKawa !

    Et désolé si j'ai un peu embrouillé les choses (quoi que j'ai mis en exergue une différence importante entre les 2 versions de Python).

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonjour,

    Note:
    Il y a parfois des 'surprises'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> s = b"ABC"
    >>> for o in s:
    ...     print(o, type(o))
    ... 
    65 <class 'int'>
    66 <class 'int'>
    67 <class 'int'>
    en fait les bytes dans python 3 sont representés par des int (censés representer des octets allant de 0 à 255)
    cf doc python
    http://docs.python.org/release/3.0.1...ons.html#bytes
    bytes([arg[, encoding[, errors]]])

    Return a new “bytes” object, which is an immutable sequence of integers in the range 0 <= x < 256. bytes is an immutable version of bytearray – it has the same non-mutating methods and the same indexing and slicing behavior.

  13. #13
    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
    Et 'int' does not support the buffer interface lui aussi.
    C'était le sens de la remarque.
    Merci d'utiliser le forum pour les questions techniques.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Et 'int' does not support the buffer interface lui aussi.
    C'était le sens de la remarque.
    ok je n'avais pas saisie

Discussions similaires

  1. [Erreur] TypeError: 'str' does not support the buffer interface
    Par Holox dans le forum Général Python
    Réponses: 7
    Dernier message: 09/08/2013, 11h30
  2. Réponses: 7
    Dernier message: 09/08/2011, 19h57
  3. Réponses: 3
    Dernier message: 29/04/2011, 11h32
  4. Réponses: 0
    Dernier message: 25/04/2010, 02h27
  5. Réponses: 1
    Dernier message: 06/03/2008, 20h24

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