Да, это "ошибка", io.open
в Python 2.6 немного сломан. Предполагалось, что он будет работать как 3.x open
, чтобы облегчить переход, но в некоторых случаях он работает неправильно. Например, он не поддерживает объекты с интерфейсом буфера, как в вашем случае. Это исправлено в Python 2.7, где встроенный open
может использоваться как open
в 3.x, а io.open
это просто псевдоним.
Если вам нужен двоичный режим, используйте open
, он ведет себя одинаково в 2.x и 3.x, с той лишь разницей, что в 2.x он принимает для записи объекты, которые он не должен (например, unicode
объектов). Если вам нужен текстовый режим, используйте codecs.open
или io.open
с аргументом encoding
. Оба доступны в 3.x.
Но обратите внимание, что open
и io.open
должны были быть не взаимозаменяемыми, потому что io
- это модуль io
в Python 3, а в Python 3 open
очень отличается от open
в Python 2.6 или меньше.
http://docs.python.org/library/io.html