【问题标题】:How to skip footer in csv file while reading with pandas read_csv and chunksize option如何在使用 pandas read_csv 和 chunksize 选项阅读时跳过 csv 文件中的页脚
【发布时间】:2019-12-25 18:18:38
【问题描述】:

我正在使用 pandas.read_csv() 和 chunksize = 500000 读取大的 csv 文件。 由于我使用的是块大小,因此“skipfooter=1”选项不适用于块大小,因为它返回的是生成器而不是数据帧。

在读取块时从文件中跳过页脚记录的最佳方法是什么?

【问题讨论】:

  • 为什么不能在事后将它们子集出来?
  • 不确定如何跟踪最后一个块以删除页脚行。
  • 您要删除每个块的页脚吗?
  • 不,只从最后一个chunk开始。Footer是整个文件的最后一条记录,大小超过3GB。
  • 我的意思是,在您阅读完所有内容后,只需放下页脚。

标签: python python-3.x pandas csv


【解决方案1】:

这样的事情会起作用:

import pandas

chunksize = 5
csv = pandas.read_csv('sample.csv', chunksize=chunksize)

class NextIterator:
    def __init__(self, iterator):
        self._iterator = iterator
        self._buffer = []

    def __iter__(self):
        return self

    @property
    def has_next(self):
        try:
            self._buffer = [next(self._iterator)]
            return True
        except StopIteration:
            return False

    def __next__(self):
        if self._buffer:
            return self._buffer.pop()
        else:
            # returns the dataframe
            return next(self._iterator)

has_next = True
b = NextIterator(csv)
while has_next:
    a = next(b)
    if b.has_next:
        print(a)
    else:
        print(a[:-1])
        has_next = False

您不一定需要创建一个类,但我发现它很有用。

使用 next 并捕获 StopIteration 您可以检查迭代器中是否还有更多内容。如果没有,您可以只切片您的块以排除最后一个元素。

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 2017-08-17
    • 1970-01-01
    • 2018-11-15
    • 2019-06-10
    • 2022-10-13
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多