2011-02-04 46 views
5

我一直認爲openio.open是可以互換的。
顯然不是,如果我相信這個片段:缺陷或功能: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 

注:我在Python 2.6.6

回答

7

測試是的,這是一個 「錯誤」,在Python 2.6 io.open略有破損。本來應該像3.x的open一樣工作來簡化轉換,但在某些情況下它不能正常工作。例如,它不支持像你的情況那樣具有緩衝接口的對象。這在Python 2.7中得到修復,其中內置的open可以像3.x中的open一樣使用,並且io.open只是它的別名。

如果您需要二進制模式,請使用open,它在2.x和3.x中表現相同,唯一區別是在2.x中,它接受寫入它不應該使用的對象(如unicode對象)。如果您需要文本模式,請使用codecs.openio.openencoding參數。兩者都可以在3.x中獲得。

但請注意,openio.open註定要不可互換,因爲io是Python 3中的io模塊,並在Python 3 open是在Python 2.6或更低的open很大的不同。

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

+0

我確認bug在python 2.7中得到了修復。非常感謝。 – Alain 2011-02-04 12:51:42