为什么我不能直接在极坐标中写入 BytesIO 缓冲区?

Why can't I write to a BytesIO buffer directly in polars?

提问人:alex23ro 提问时间:11/15/2023 更新时间:11/15/2023 访问量:51

问:

在熊猫中,我可以做这样的事情:

buffer = BytesIO()
df.write_parquet(buffer)

# later, I can read the bytes
buffer.read()

但是当我在极地执行此操作时,缓冲区是空的。为什么会这样?

就上下文而言,我想这样做的原因是因为我喜欢使用库,这样我就可以直接将字节写入 s3 中。我知道还有其他方法可以实现这一点,例如使用 s3fs,但我想知道为什么直接写入缓冲区不起作用。cloudpathlib

python-极地

评论

2赞 jasonharper 11/15/2023
为了处理您的对象,您需要查找文件的开头,或者使用不关心当前文件位置的 which。.read()BytesIO.getvalue()

答:

1赞 Dean MacGregor 11/15/2023 #1

缓冲区不是空的,你只是在它的尽头。这就像你在笔记本上的一张纸上写了几段,然后翻开页面,当你低头看笔记本时,它是空的。这并不是说笔记本没有“存储”你写的东西,只是它在你看的地方后面。

例如,这有效:

import polars as pl
from io import BytesIO
buffer=BytesIO()
df=pl.DataFrame({'a':[1,2,3]})
df.write_parquet(buffer)
buffer.seek(0)  # This is what you need to do to start from the beginning and read.
print(pl.read_parquet(buffer))
shape: (3, 1)
┌─────┐
│ a   │
│ --- │
│ i64 │
╞═════╡
│ 1   │
│ 2   │
│ 3   │
└─────┘

评论

0赞 alex23ro 11/15/2023
啊。这是有道理的。谢谢你的解释!