2015-10-15 13 views
5

Hedeflerim farklı olmasına rağmen 'u this post takip ederek alt sınıflara ayırmaya çalışıyorum. Bu veriyor benAlt sınıflama dosyası io.TextIOWrapper` alt sınıfına göre sınıflandırılıyor - ancak yapıcının sahip olduğu hangi imza var?

In [81]: f = MyTextIOFile("file.csv") 

kullanarak yapıcı kullanarak bir dosyayı açmaya çalışıyorum ama

class MyTextIOFile(io.TextIOWrapper): 
    def read(self, *args): 
     cont = super().read(*args) 
     return cont.replace("\x00", "") 

: Bu (: motivation NB) ile kapalı başlayarak aslında

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-90-343e18b2e32f> in <module>() 
----> 1 f = MyTextIOFile("file.csv") 

AttributeError: 'str' object has no attribute 'readable' 

Ve io.TextIOWrapper s yapıcısının bir dosya nesnesinden geçirilmesini beklediği görülür. Deneme ve hata yoluyla, bu dosya nesnesinin ikili modunda açılmasının gerekli olduğunu keşfettim. Ancak, herhangi bir yerde belge bulamıyorum ve belgesiz davranışın üzerine inşa etmek gibi hissetmiyorum (gerçekten de, bir adım ileride, benim nesneyi csv.reader nesnesine iletmeye çalışırken sorunlara yol açıyor). Python 3'te bir dosya nesnesinin alt sınıfının doğru ve desteklenen yolu nedir?

Python 3.5.0 kullanıyorum.

+2

Bunun yerine bileşimi kullanmayı düşünün; Dosyayı açmak ve yerine döndürülen nesneye bir referans kaydetmek için sınıfınızı 'open' kullanmalısınız. – chepner

+0

@chepner Tam olarak ne demek istediğinizden emin değilim - "io.IOBase" ailesinden miras almayı kastediyor musunuz? Sonunda bunu 'csv.csvreader' dosyasına aktarmak istiyorum ve bu yüzden amacım tüm NUL'lerden arındırılmış olan dosyayı okumaktır (bkz. [Bu soru] (http://stackoverflow.com/a/4169762/974555)). – gerrit

+0

Sağ; "csv.csvreader", yineleyici protokolünü uyguladığı sürece (yani, sonraki satırı almak için çağrılabilecek bir sonraki "yönteme sahip olduğu sürece) ne tür bir bakım aldığını umursamaz. – chepner

cevap

2

ben aradığınız dokümantasyon

class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False) 
    A buffered text stream over a BufferedIOBase binary stream. [...] 

İlk argüman open tarafından ikili modda açılan bir şeyi ima eden ikili akışı, olduğunu düşünüyorum. "Sabitleme" csv dosyası, aynı zamanda kullanabileceği bir jeneratör kadarıyla

0

:

# untested 
def FixCsv(csv_file, *args, **kwds): 
    "assumes text-mode file; removes NUL-bytes" 
    if isinstance(csv_file, str): 
     file_obj = open(csv_file, *args, **kwds) 
    else: 
     file_obj = csv_file 
    for line in file_obj: 
     yield line.replace('\x00','') 
    file_obj.close() 

Ama senin sorunun muhtemelen utf-16 kodlanmış dosyası nedeniyle oluşur.

+0

utf-16 kodlanmış değil. Kodlamayı bilmiyorum. Surveymonkey tarafından oluşturulan bir CSV. Ama bu farklı bir soru (sorumun bir XY problemi olduğunu anlıyorum). – gerrit

İlgili konular