2011-02-04 23 views
5

Ben her zaman open ve io.open değiştirilebilir olduklarını düşündüm.hata veya özellik: open ve io.open değiştirilemez

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 

Not: Bu pasajı inanıyorsanız
Görünüşe değil, ben Evet, bir "böcek", Python 2.6 io.open hafifçe kırılır var Python 2.6.6

cevap

7

test. Geçişi kolaylaştırmak için 3.x'in open gibi çalışması gerekiyordu, ancak bazı durumlarda doğru çalışmıyor. Örneğin, durumunuzda olduğu gibi arabellek arabirimi olan nesneleri desteklemez. Bu, open yerleşkesinin 3.x'te open gibi kullanılabildiği ve io.open10'un bir takma ad olduğu Python 2.7'de giderilmiştir.

İkili moda gereksiniminiz varsa, open kullanın, 2.x ve 3.x'te aynı davranır. Tek fark, 2.x'de olması gereken nesneleri yazmayı kabul etmesidir (unicode gibi) nesneleri). Metin moduna ihtiyacınız varsa, encoding bağımsız değişkeni ile codecs.open veya io.open kullanın. Her ikisi de 3.x'te mevcuttur. io Python 3'ün io modül ve Python 3'te open Python 2.6 veya daha az open çok farklıdır çünkü

Ama open ve io.open birbirinin olmayacak demek olduğumuzu unutmayın.

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

+0

Böcek piton 2.7 giderilmiştir alındığını teyit ediyoruz. Çok teşekkürler. – Alain

İlgili konular