2015-10-15 5 views
5

サブタイトルio.TextIOWrapperの後にthis postとしていますが、私の目的は異なります。この(:motivation NB):でオフに開始`io.TextIOWrapper`をサブクラス化してファイルをサブクラス化しますが、そのコンストラクタにはどのような署名がありますか?

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

私は

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

を使用して私のコンストラクタを使用してファイルを開くしようとしているが、これが与える:、

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

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

そして実際にio.TextIOWrapperコンストラクタがファイルオブジェクトを渡すと予想されます。試行錯誤を経て、私はこのファイルオブジェクトをバイナリモードで開く必要があることを発見しました。しかし、私はドキュメントをどこにも見つけることができず、文書化されていない動作の上に構築するような気がしません(実際には、オブジェクトをcsv.readerに渡そうとすると、 Python 3でファイルオブジェクトをサブクラス化する正しい方法とサポートされている方法は何ですか?

私はPython 3.5.0を使用しています。

+2

代わりに構図を使用することを検討してください。あなたのクラスに 'open'を使ってファイルを開き、代わりに返されたオブジェクトへの参照を保存させます。 – chepner

+0

@chepner io.IOBase'ファミリーから継承しないという意味ですか?最終的に私はこれを 'csv.csvreader'に渡したいので、私の目的はすべてのNULを取り除いたファイルを読むことです([この質問](http://stackoverflow.com/a/4169762/974555)参照))。 – gerrit

+0

右; 'csv.csvreader'は、イテレータプロトコルを実装している限り(つまり、次の行を取得するために呼び出すことができる' next'メソッドを持っていれば)、受信するタイプを気にしません。 – chepner

答えて

2

私はあなたが探しているドキュメントは

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

最初の引数はopenによってバイナリモードで開かれたものを意味し、バイナリストリームであると思います。

0

限り、あなたのcsvファイルを「固定」として、あなたはまた、発電機を使用できます。

# 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() 

をしかし、あなたの問題は、おそらくUTF-16でエンコードされたファイルによって引き起こされます。

+0

utf-16でエンコードされていません。私はエンコーディングを知らない。 Surveymonkeyによって生成されたCSVです。しかしそれは別の質問です(私の質問は多少XY問題です)。 – gerrit

関連する問題