pd.read_csv中隐藏的__len__调用?

时间:2018-11-27 20:24:09

标签: python pandas

__len__似乎被过早调用,而没有被调试器(与Studio)检测到。请看下面的简化代码,它再现了问题。

class DataFrameReader:

    #
    def __init__(self, filePath, header=None, bufferLines=1000): 
        """docstring"""

        self._dataFrameReader = None
        self.BufferLines = bufferLines
        self._peekBuffer = None

        self._dataFrameReader = pd.read_csv(filePath,
            dtype=header, chunksize=bufferLines)

        return

    #
    def __len__(self): 
        """docstring"""

        lineCount = None
        if not self._peekBuffer:
            self._peekBuffer = next(self._dataFrameReader, [])

        lineCount = len(self._peekBuffer)

        return lineCount

当我创建此类的实例时:

filePath = ((r'C:\Users\jmarshall\source\repos\')
            (r'First200_Base_TestDataFrameIO.csv'))
_dfr = DataFrameReader(filePath, bufferLines=25)

在第11行中实例化数据帧TextReader(pd.read_csv)之后,变量self._peekBuffer的值成为我正在读取的csv的前25条记录,格式为数据帧。

这怎么可能发生?

self._peekBuffer仅应在DataFrameReader实例(例如len(_dfr))上调用len后才包含数据。

pd.read_csv可以知道其包含对象的__len__方法并能够调用它,真是太疯狂了。此外,当我将它们留在__len__方法中时,不会遇到断点,但是如果我注释掉__len__,则self._peekBuffer会保持为None(应该是!) )。

有什么想法吗?

0 个答案:

没有答案