Я пытаюсь подкласса io.TextIOWrapper
после this post, хотя мои цели разные. Начав с этого (NB: motivation):Подклассификация файла путем подкласса `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
s конструктор ожидает передачи файлового объекта. Через пробную версию и ошибку я обнаружил, что этот файл должен быть открыт в двоичном режиме. Но я не могу найти документацию нигде, и мне не хочется строить поверх недокументированного поведения (действительно, одна попытка продолжить это уже приводит к проблемам при попытке передать мой объект csv.reader
). Каков правильный и поддерживаемый способ подкласса файлового объекта в Python 3?
Я использую Python 3.5.0.
Рассмотрите возможность использования композиции; попросите свой класс использовать 'open', чтобы открыть файл и сохранить ссылку на возвращенный объект. – chepner
@chepner Я не уверен, что вы имеете в виду - вы имеете в виду не наследование от семьи 'io.IOBase'? В конечном итоге я хочу передать это 'csv.csvreader', поэтому моя цель - прочитать файл, лишенный всех NUL (см. [Этот вопрос] (http://stackoverflow.com/a/4169762/974555)). – gerrit
Право; 'csv.csvreader' не заботится о том, какой тип он получает, если он реализует протокол итератора (т. е. имеет следующий метод, который можно вызвать для получения следующей строки). – chepner