2011-02-04 8 views
5

Siempre pensé que open y io.open eran intercambiables.
Aparentemente no, si creo que este fragmento:error o característica: abrir y io.open no son intercambiables

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 

Nota: He probado en Python 2.6.6

Respuesta

7

Sí, se trata de un "error", io.open en Python 2.6 es ligeramente roto. Se suponía que era un trabajo como el de 3.x open para facilitar la transición, pero no funciona correctamente en algunos casos. Por ejemplo, no admite objetos con la interfaz de búfer como en su caso. Esto se soluciona en Python 2.7, donde el open incorporado se puede usar como el open en 3.x, y io.open es solo un alias para él.

Si necesita el modo binario, use open, se comporta igual en 2.x y 3.x, con la única diferencia de que en 2.x acepta escribir objetos que no debería (como unicode objetos). Si necesita el modo de texto, use codecs.open o io.open con el argumento encoding. Ambos están disponibles en 3.x.

Pero tenga en cuenta que open y io.open estaban destinados a no ser intercambiables, porque es ioio módulo de Python 3, y en Python 3 open es muy diferente de la open en Python 2.6 o menos.

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

+0

confirmo que el error se corrigió en Python 2.7. Muchas gracias. – Alain

Cuestiones relacionadas