我试图在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。
答案 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编码的文件引起的。