通过继承`io.TextIOWrapper`对子文件进行子类化 - 但它的构造函数有哪些签名?

时间:2015-10-15 18:19:25

标签: python python-3.x io subclassing

我试图在this post之后继承io.TextIOWrapper,尽管我的目标不同。从这开始(NB:motivation):

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的构造函数希望传递一个文件对象。通过反复试验,我发现这个文件对象需要以二进制模式打开。但我无法在任何地方找到文档,而且我不想构建在无证件行为之上(事实上,尝试继续使用它已经导致我在尝试将对象传递给{{}时遇到问题1}})。在Python 3中对文件对象进行子类化的正确和受支持的方法是什么?

我使用的是Python 3.5.0。

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找的文档是

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

第一个参数是二进制流,它意味着由open以二进制模式打开的东西。

答案 1 :(得分:0)

至于&#34;修复&#34;您的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编码的文件引起的。