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)