У меня есть BytesIO, что я добавляю различные байты. Я хочу отправить это в urllib2.Request с помощью метода request.add_data. Как мне это сделать? Когда я попробуюPython - BytesIO и urllib2.add_data
# create request ....
bytesio = BytesIO()
bytesio.write(open("C:\img.jpg", "rb").read())
request.add_data(bytesio.getvalue())
bytesio.close()
urllib2.urlopen(request) # error "expected buffer, got bytes"
Что я делаю неправильно? Я новичок в Python и не знаю, как создать буфер из BytesIO. Кроме того, когда я просто попробую:
Я получаю операцию ввода-вывода в закрытом файле. Если я попытаюсь подождать, пока после того, как urlopen вызовет bytesio.close, запрос просто зависает, потому что он ждет закрытия байо.
Что мне нужно сделать?
Ответ
request.add_data(str(btyesio.getvalue()))
bytesio.close()
Кастинг в строку сделал его счастливым. Я не пытался увидеть, все ли работает с StringIO, и я не пробовал различия между Python 2.x и 3.x.
Мне нужно добавить несколько элементов (файлы, обычный текст) ... Вот почему я использовал BytesIO для создания данных, прежде чем устанавливать его в запросе. – Chad
Также: вы сказали, что ожидает строку. Строки и «буфер» одинаковы? – Chad
строки в python имеют тот же интерфейс, что и ['buffer'] (http://docs.python.org/library/functions.html#buffer), поэтому все ожидания буфера также могут обрабатывать строку. В python2 вы, вероятно, должны использовать 'StringIO.StringIO' вместо' BytesIO'. В cPython 2.7 'bytes' совпадает с' str', может быть, IronPython здесь отличается. - и не забудьте установить заголовок «Content-Type», если вы не хотите, чтобы ваши данные отправлялись как «application/x-www-form-urlencoded» – mata