我正在使用以下代码读取作为API响应的数据块:

d = zlib.decompressobj(zlib.MAX_WBITS|16)  # for gzip
for i in range(0, len(data), 4096):
    chunk = data[i:i+4096]
    # print(chunk)
    str_chunk = d.decompress(chunk)
    str_chunk = str_chunk.decode()
    # print(str_chunk)
    if '"@odata.nextLink"' in str_chunk:
        ab = '{' + str_chunk[str_chunk.index('"@odata.nextLink"'):len(str_chunk)+1]
        ab = ast.literal_eval(ab)
        url = ab['@odata.nextLink']
        return url

这种工作方式的一个例子是: "@odata.nextLink":"someurl?$count=true

它在大多数情况下都可以工作,但有时这个键值对会被切断,并显示如下所示: "@odata.nextLink":"someurl?$coun

我可以玩弄这行for i in range(0, len(data), 4096)中的位数,但这并不能确保在某些情况下数据不会中断,因为页面大小(数据大小)对于每个页面大小可能是不同的.

我如何确保这个键值对永远不会被切断.还要注意,这个键值对是API响应的最后一行/最后一个键值对.

附注:我不能玩弄API请求参数.

我甚至试着倒着读,但这给出了标题不正确的问题:

for i in range(len(data), 0, -4096):
                chunk = data[i -4096: i]
                str_chunk = d.decompress(chunk)
                str_chunk = str_chunk.decode()
                if '"@odata.nextLink"' in str_chunk:
                    ab = '{' + str_chunk[str_chunk.index('"@odata.nextLink"'):len(str_chunk)+1]
                    ab = ast.literal_eval(ab)
                    url = ab['@odata.nextLink']
                    #print(url)
                    return url

上面的代码产生了以下错误,这真的很奇怪:

str_chunk = d.decompress(chunk)
zlib.error: Error -3 while decompressing data: incorrect header check

推荐答案

str_chunk是API响应中的连续字节序列,可以从响应中的任何位置开始,到响应中的任何位置结束.它有时会在一些语义内容的中间结束.

(来自OP疏忽提出质疑的 comments 的新信息.事实上,这仍然是不成问题的.OP要求不将整个未压缩内容保存在内存中.)

如果"@odata.nextLink"是你正在寻找的东西的可靠标记,那么保留最后two个解压缩的块,将它们连接在一起,然后寻找那个标记.一旦找到,继续阅读更多的块,将它们连接起来,直到你有了你想要的完整内容.

Python相关问答推荐

添加包含中具有任何值的其他列的计数的列

对Numpy函数进行载体化

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

将整组数组拆分为最小值与最大值之和的子数组

如何在Windows上用Python提取名称中带有逗号的文件?

如何使用html从excel中提取条件格式规则列表?

运行终端命令时出现问题:pip start anonymous"

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

计算组中唯一值的数量

将tdqm与cx.Oracle查询集成

在Python中动态计算范围

NumPy中条件嵌套for循环的向量化

Pandas Loc Select 到NaN和值列表

索引到 torch 张量,沿轴具有可变长度索引

* 动态地 * 修饰Python中的递归函数

跳过嵌套JSON中的级别并转换为Pandas Rame

不允许 Select 北极滚动?

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

对于数组中的所有元素,Pandas SELECT行都具有值

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?