263 votes

TypeError: 'str' ne supporte pas l'interface tampon

 string = input("Please enter the text you want to compress")
file = input("Please enter the desired filename")
with gzip.open(file+".gz","wb") as f_out:
    f_out.write(string) 
 

Le code python ci-dessus me donne l'erreur suivante:

 Traceback (most recent call last):
  File "C:/Users/Ankur Gupta/Desktop/Python_works/gzip_work1.py", line 33, in <module>
    compress_string()
  File "C:/Users/Ankur Gupta/Desktop/Python_works/gzip_work1.py", line 15, in compress_string
    f_out.write(string)
  File "C:\Python32\lib\gzip.py", line 312, in write
    self.crc = zlib.crc32(data, self.crc) & 0xffffffff
TypeError: 'str' does not support the buffer interface
 

292voto

Michał Niklas Points 15907

Si vous utilisez Python3x alors string n'est pas du même type que pour Python 2.x, vous devez le convertir en bytes (l'encoder).

 s = input("Please enter the text you want to compress")
fn = input("Please enter the desired filename")
with gzip.open(fn+".gz","wb") as f_out:
    f_out.write(bytes(s, 'UTF-8'))
 

N'utilisez pas non plus de noms de variables comme string ou file que ce sont des noms de module ou de fonction.

EDIT @Tom

Oui, le texte non ASCII est également compressé / décompressé. J'utilise des lettres polonaises avec un codage UTF-8:

 s = 'Polish text: ąćęłńóśźżĄĆĘŁŃÓŚŹŻ'
fn = 'fn.gz'
with gzip.open(fn, 'wb') as f_out:
    f_out.write(bytes(s, 'UTF-8'))
with gzip.open(fn, 'r') as f_in:
    s2 = f_in.read().decode('UTF-8')
print(s2)
 

96voto

user1175849 Points 56

Si vous avez la chance d'utiliser Python 3.4, il existe une solution plus simple à ce problème.

Vous avez juste besoin d'ajouter au mode pour qu'il devienne "wt". Cela provoque Python pour ouvrir le fichier en tant que fichier texte et non binaire. Alors tout va juste fonctionner.

Le programme complet devient ceci:

 string = input("Please enter the text you want to compress")
file = input("Please enter the desired filename")
with gzip.open(file+".gz","wt") as f_out:
    f_out.write(string) 
 

42voto

Andreas Jung Points 1

Vous ne pouvez pas sérialiser une chaîne 'Python 3' en octets sans conversion explicite en un encodage.

 f_out.write(string.encode('utf-8'))
 

est peut-être ce que tu veux. Cela fonctionne aussi pour python 2.x et 3.x.

28voto

Skurmedel Points 9227

Pour Python 3.x, vous pouvez convertir votre texte en octets bruts via:

 bytes("my data", "encoding")
 

Par exemple:

 bytes("attack at dawn", "utf-8")
 

L'objet retourné fonctionnera avec f_out.write .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X