bug或功能:open和io.open不可互换

Ala*_*ain 5 python api file-io

我一直以为open并且io.open可以互换.
显然不是,如果我相信这个片段:

import ctypes, io

class POINT(ctypes.Structure):
    _fields_ = [("x", ctypes.c_int),("y", ctypes.c_int)]
# THIS WORKS
with open("mypoints.bin", "wb") as f: 
    for i in range(10):
        p = POINT(i,10-i)
        print p.x, p.y
        f.write(p)
# THIS FAILS 
with io.open("mypoints.bin", "wb") as f:
    for i in range(10):
        p = POINT(i,10-i)
        print p.x, p.y
        f.write(p)

0 10
Traceback (most recent call last):
  File "D:\test.py", line 10, in <module>
    f.write(p)
  File "c:\Python26\lib\io.py", line 1070, in write
    self._write_buf.extend(b)
TypeError: 'POINT' object is not iterable
Run Code Online (Sandbox Code Playgroud)

注意:我在Python 2.6.6中测试过

Ros*_*ron 7

是的,这是一个"bug",io.open在Python 2.6中略有不同.它应该像3.x一样工作open以简化转换,但在某些情况下它无法正常工作.例如,它不支持具有缓冲区接口的对象,就像您的情况一样.这在Python 2.7中得到修复,其中内置open可以像open3.x 一样使用,并且io.open只是它的别名.

如果你需要使用二进制模式,open它在2.x和3.x中的行为相同,唯一的区别在于2.x它接受写入它不应该的unicode对象(例如对象).如果需要文本模式,请使用codecs.openio.openencoding参数.两者都有3.x.

但请注意,open并且io.open意味着不可互换,因为io是Python 3的io模块,并且在Python 3 open中与openPython 2.6或更少版本有很大不同.

http://docs.python.org/library/io.html