我有一个支持光标(arcpy.da.SearchCursor)对象,我需要将其加载到pandas数据帧中。
它实现了next(),reset(),正如您对Python中的生成器对象所期望的那样。
使用stackexchange中的另一篇文章,这很棒,我创建了一个类,使生成器像一个类文件对象。这适用于默认情况,其中未设置chunksize,但是当我为每个数据帧设置块大小时,它会崩溃python。
我的猜测是需要实现n = 0,所以返回x行数,但到目前为止这是错误的。
实现我的类的正确方法是什么,所以我可以使用生成器来加载数据帧?我需要使用chunksize,因为我的数据集非常庞大。
所以伪代码是:
customfileobject = Reader(cursor)
dfs = pd.read_csv(customfileobject, columns=cursor.fields,
chunksize=10000)
我正在使用Pandas版本0.16.1和Python 2.7.10。
以下课程:
class Reader(object):
"""allows a cursor object to be read like a filebuffer"""
def __init__(self, fc=None, columns="*", cursor=None):
if cursor or fc:
if fc:
self.g = arcpy.da.SearchCursor(fc, columns)
else:
self.g = cursor
else:
raise ValueError("You must provide a da.SearchCursor or table path and column names")
def read(self, n=0):
try:
vals = []
if n == 0:
return next(self.g)
else:
# return multiple rows?
for x in range(n):
try:
vals.append(self.g.next())
except StopIteration:
return ''
except StopIteration:
return ''
def reset(self):
self.g.reset()
答案 0 :(得分:0)
尝试以下read
功能:
def read(self, n=0):
if n == 0:
try:
return next(self.g)
except StopIteration:
return ''
else:
vals = []
try:
for x in range(n):
vals.append(next(self.g))
except StopIteration:
pass
finally:
return ''.join(vals)
您应该使用pd.read_csv
参数(不是names
)告诉columns
列名称,并且没有标题行(header=None
)。