2016-12-02 1 views
5

Я хочу написать файл. Основываясь на имени файла, это может быть или не быть сжато с помощью модуля gzip. Вот мой код:Python3 написать gzip-файл - memoryview: необходим байтоподобный объект, а не 'str'

import gzip 
filename = 'output.gz' 
opener = gzip.open if filename.endswith('.gz') else open 
with opener(filename, 'wb') as fd: 
    print('blah blah blah'.encode(), file=fd) 

Я открываю записываемый файл в двоичном режиме и кодирования моих строк должны быть записано. Однако я получаю следующую ошибку:

File "/usr/lib/python3.5/gzip.py", line 258, in write 
    data = memoryview(data) 
TypeError: memoryview: a bytes-like object is required, not 'str' 

Почему мой объект не является байтом? Я получаю ту же ошибку, если я открою файл с 'w' и пропустим шаг кодирования. Я также получаю ту же ошибку, если я удалю '.gz' из имени файла.

Я использую Python3.5 на Ubuntu 16.04

+1

Его также как 'print (str ('blah blah blah'.encode()), file = fd)'. python пытается написать строковое представление объекта bytes. – tdelaney

ответ

4

print является относительно сложной функцией. Он записывает str в файл, но не str, который вы передаете, он записывает str, что является результатом рендеринга параметров.

Если у вас уже есть байты, вы можете напрямую использовать fd.write(bytes) и позаботиться о добавлении новой строки, если вам это нужно.

Если у вас нет байтов, убедитесь, что fd открыт для получения текста.

+0

использовать 'fd.write (b "blah blah blah")' –

+0

@citizenSNIPS, я не понимаю, что вы комментируете. – Javier

+0

добавьте 'b' infront от str, чтобы указать, что это байт. Я считаю, что вы хотите передать байтовый литерал. [] (https://www.python.org/dev/peps/pep-3112/) –

2

Вы можете преобразовать его в байты, подобные этому.

import gzip 
with gzip.open(filename, 'wb') as fd: 
    fd.write('blah blah blah'.encode('utf-8')) 
Смежные вопросы