gpt4 book ai didi

python - Pandas to_csv 到 Python 3 中的 GzipFile 不起作用

转载 作者:行者123 更新时间:2023-11-28 19:03:23 28 4
gpt4 key购买 nike

在 Python 2.7 (Pandas 0.22.0) 中,将 Pandas 数据帧保存到内存中的压缩 csv 工作方式如下:

from io import BytesIO
import gzip
import pandas as pd
df = pd.DataFrame.from_dict({'a': ['a', 'b', 'c']})
s = BytesIO()
f = gzip.GzipFile(fileobj=s, mode='wb', filename='file.csv')
df.to_csv(f)
s.seek(0)
content = s.getvalue()

但是,在 Python 3.6 (Pandas 0.22.0) 中,相同的代码在调用 to_csv 时会抛出错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lib/python3.6/site-packages/pandas/core/frame.py", line 1524, in to_csv
formatter.save()
File "lib/python3.6/site-packages/pandas/io/formats/format.py", line 1652, in save
self._save()
File "lib/python3.6/site-packages/pandas/io/formats/format.py", line 1740, in _save
self._save_header()
File "lib/python3.6/site-packages/pandas/io/formats/format.py", line 1708, in _save_header
writer.writerow(encoded_labels)
File "miniconda3/lib/python3.6/gzip.py", line 260, in write
data = memoryview(data)
TypeError: memoryview: a bytes-like object is required, not 'str'

我应该如何解决这个问题?我是否需要以某种方式更改 GzipFile 对象以便 to_csv 正确处理它?<​​/p>

澄清一下,我想在内存中创建 gzip 文件(content 变量),这样我就可以使用 Boto 3 put_object 将它保存到 Amazon S3。稍后。

最佳答案

你可以利用StringIO:

from io import StringIO
buf = StringIO()
df.to_csv(buf)
f = gzip.GzipFile(fileobj=s, mode='wb', filename='file.csv')
f.write(buf.getvalue().encode())
f.flush()

另请注意添加的 f.flush() - 根据我的经验,如果没有此行,GzipFile 可能在某些情况下随机不刷新数据,从而导致存档损坏.

或者作为基于您的代码的完整示例:

from io import BytesIO
import gzip
import pandas as pd
from io import StringIO
df = pd.DataFrame.from_dict({'a': ['a', 'b', 'c']})
s = BytesIO()
buf = StringIO()
f = gzip.GzipFile(fileobj=s, mode='wb', filename='file.csv')
df.to_csv(buf)
f.write(buf.getvalue().encode())
f.flush()
s.seek(0)
content = s.getvalue()

关于python - Pandas to_csv 到 Python 3 中的 GzipFile 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039500/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com