TypeError: 'str' does not support the buffer interface
TypeError: 'str' не поддерживает интерфейс буфера
plaintext = input("Please enter the text you want to compress") filename = input("Please enter the desired filename") with gzip.open(filename + ".gz", "wb") as outfile: outfile.write(plaintext)
Приведенный выше код python выдает следующую ошибку:
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 outfile.write(plaintext) 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
Переведено автоматически
Ответ 1
Если вы используете Python3x, то string это не тот же тип, что и для Python 2.x, вы должны преобразовать его в байты (закодировать).
plaintext = input("Please enter the text you want to compress") filename = input("Please enter the desired filename") with gzip.open(filename + ".gz", "wb") as outfile: outfile.write(bytes(plaintext, 'UTF-8'))
Также не используйте имена переменных типа string или file, если это имена модуля или функции.
РЕДАКТИРОВАТЬ @Tom
Да, текст, отличный от ASCII, также сжимается / распаковывается. Я использую польские буквы в кодировке UTF-8:
plaintext = 'Polish text: ąćęłńóśźżĄĆĘŁŃÓŚŹŻ' filename = 'foo.gz' with gzip.open(filename, 'wb') as outfile: outfile.write(bytes(plaintext, 'UTF-8')) with gzip.open(filename, 'r') as infile: outfile_content = infile.read().decode('UTF-8') print(outfile_content)
Ответ 2
Есть более простое решение этой проблемы.
Вам просто нужно добавить t в режим, чтобы он стал wt. Это заставляет Python открывать файл как текстовый, а не двоичный. Тогда все будет просто работать.
Полная программа становится такой:
plaintext = input("Please enter the text you want to compress") filename = input("Please enter the desired filename") with gzip.open(filename + ".gz", "wt") as outfile: outfile.write(plaintext)
Ответ 3
Вы не можете сериализовать 'строку' Python 3 в байты без явного преобразования в некоторую кодировку.
outfile.write(plaintext.encode('utf-8'))
возможно, это то, что вы хотите. Также это работает как для python 2.x, так и для 3.x.
Ответ 4
Для Python 3.x вы можете преобразовать свой текст в необработанные байты с помощью:
bytes("my data", "encoding")
Например:
bytes("attack at dawn", "utf-8")
Возвращаемый объект будет работать с outfile.write.