使用可变大小块'pd.read_csv':如何在不尝试/例外的情况下停止?

  • 本文关键字:情况下 pd csv read python pandas csv
  • 更新时间 :
  • 英文 :


pd.read_csv(iterator=True)返回TextFileReader类型的迭代器。我需要调用TextFileReader.get_chunk来指定每次调用要返回的行数。

import random
import pandas as pd
chunks = pd.read_csv('file.csv', iterator=True)
try:
while True:
chunk = chunks.get_chunk(random.randint(1,3))
print(chunk)
except StopIteration:
pass

有没有办法摆脱这个代码中的try结构?换句话说,有没有一个条件放入while语句来指示迭代器没有更多的行要传递?

下面是一些用于测试的csv内容:

年份"成绩"标题">
1968、86、问候">
1970、17、血腥妈妈">
1971、40、生而为胜">
1973、98、贱街">
1973,88、"慢慢敲鼓">
1976、41、"最后的大亨">
1976、99、"出租车司机">

指出

我知道for循环旨在捕获StopIteration信号,并且有一种方法可以迭代pd.read_csv返回的TextFileReader,但在这种情况下,我认为我无法管理返回的行数可变,它必须是固定的:

chunks = pd.read_csv('file.csv',chunksize=3)
for chunk in chunks:
print(chunk)

使用文档的困难:

由于某些原因,pandas文档没有提供pandas.io.parsers.TextFileReader的文档,我找到的唯一伪文档来自kite站点,并且大部分是一个空壳。

似乎TextFileReader在某种程度上也是一个上下文管理器,这可能是另一种解决方案。然而,情况不再是这样了,尽管文档仍然说它是一个,并提供了不工作的示例,如:

with pd.read_csv("tmp.sv", sep="|", iterator=True) as reader:
reader.get_chunk(5)

希望这段代码能解决你的问题

在使用块时,非常需要生成器。

def read():
chunksize = 10000
with open('Sample.csv','r') as f:
while True:
read_data = f.read(chunksize)
if not read_data:
break
yield read_data

当你打印函数时,你会得到生成器对象<generator object read_chunks.<locals>.read at 0x0000029DEE9F20C8>,你可以通过for循环迭代得到每一行,你可以把它转换成Dataframe

如果是3.8+版本,海象操作符可能就是你要找的:

import random
while (chunk := chunks.get_chunk(random.randint(1,3))):
print(chunk)

相关内容

  • 没有找到相关文章