使用 Python3 将 Bytes 对象转换为 Pandas 数据帧会产生一个空数据帧。为啥?

Posted

技术标签:

【中文标题】使用 Python3 将 Bytes 对象转换为 Pandas 数据帧会产生一个空数据帧。为啥?【英文标题】:Converting a Bytes object into a Pandas dataframe with Python3 results in an empty dataframe. Why?使用 Python3 将 Bytes 对象转换为 Pandas 数据帧会产生一个空数据帧。为什么? 【发布时间】:2021-07-20 22:28:00 【问题描述】:

我正在阅读有关 Bytes 库和 Pandas 的信息,我认为以下帖子中的答案应该对我有用:

How to convert bytes data into a python pandas dataframe?

但是,它们都不起作用。

我有一个包含一些内容的 CSV 文件。当我将它加载到 Odoo 时,它会将文件返回到 Bytes 对象中。我想用pandas 读取这个Bytes 对象并将其转换为dataframe 以便使用dataframe 方法。

Bytes 对象来自我班级的属性file_to_import(这就是为什么你会在我的代码中看到self.file_to_import)。如果我显示它的类型,它会返回<class 'bytes'>。如果我解码它,我会得到它各自的字符串:

ZGVmYXVsdF9jb2RlO25hbWU7ZGVzY3JpcHRpb25fc2FsZTtjYXRlZ29yeV9pZC9pZDtzdGFuZGFyZF9wcmljZTtsaXN0X3ByaWNlOzs7dHlwZTtiYXJjb2RlO3NlbGxlcl9pZHMvbmFtZS9pZDtzZWxsZXJfaWRzL3Byb2R1Y3RfbmFtZTtzZWxsZXJfaWRzL3Byb2R1Y3RfY29kZQpXNS5GLTA2NjY2ODtOZXN0YSBDaHJvbWUgNjA7TmVzdGEgQ2hyb21lIDYwLiBDYWxkZXJhIGRlIGNvbmRlbnNhY2nDs24gbXVyYWwgZGUgZ2FzIGRlIDYwIGtXLCBjb24gcXVlbWFkb3IgZGUgcHJlbWV6Y2xhIGUgaW50ZXJjYW1iaWFkb3IgcGlyb3R1YnVsYXIgYXV0b2xpbXBpYWJsZSBkZSBhY2VybyBpbm94aWRhYmxlLCByYXRpbyBkZSBtb2R1bGFjacOzbiAxMDoxMDA7Q2FsZGVyYXMgeSBjYWxlbnRhZG9yZXMgZGUgYWd1YTsxMTI5OzM2NTA7U0k7U0k7cHJvZHVjdDs7QUlDIFNBOzYwIGtXIFdhbGwgaHVuZyBib2lsZXIgaW4gY2FydG9uIGJveCB3aXRoOiBib2lsZXIgQW5jbGFqZSBwYXJlZCwgcGxhc3RpYyBzaXBob24gd2l0aCBnYXNrZXQgYW5kIGNsaXAsIHVzZXIncyBtYW51YWwgaW4gRW5nbGlzaCBsYW5ndWFnZTtXNS5GLTA2NjY2OApXMS5GLTA2NjY2OTtTYWZhcmkgMTAwMDtTYWZhcmkgMTAwMCBwbHVzIDI4OTM0MDE7Q2FsZGVyYXMgeSBjYWxlbnRhZG9yZXMgZGUgYWd1YTsxMTI5OzM2NTA7U0k7U0k7cHJvZHVjdDs7QUlDIFNBOzYwIGtXIFdhbGwgaHVuZyBib2lsZXIgaW4gY2FydG9uIGJveCB3aXRoOiBib2lsZXIgQW5jb GFqZSBwYXJlZCwgcGxhc3RpYyBzaXBob24gd2l0aCBnYXNrZXQgYW5kIGNsaXAsIHVzZXIncyBtYW51YWwgaW4gRW5nbGlzaCBsYW5ndWFnZTtXMS5GLTA2NjY2OQo7OztTdXN0aXR1aXIgQ2FsZGVyYXMgeSBjYWxlbnRhZG9yZXMgZGUgYWd1YSBwb3IgY8OzZGlnbyByYXJvO8K / UHJlY2lvIGRlIGNvbXByYSBkZSB0b2RvcyBsb3MgcHJvdmVlZG9yZXMgbyBzw7NsbyBkZSBlc3RlIHByb3ZlZWRvciBjb25jcmV0bz87O8K / Pzs7OztTdXN0aXR1aXIgQUlDIFNBIHBvciBzdSBjw7NkaWdvIHJhcm87Owo = P>

看起来还可以,应该够了:

from io import BytesIO
import pandas as pd

df = pd.read_csv(BytesIO(self.file_to_import))

但是,df 没有任何行,如果我检查df.empty,它会返回True,因此dataframe 没有任何信息。如果我在尝试将 BytesIO 对象转换为 dataframe 之前检查它的大小,它会返回 1376 字节,这似乎没问题,因为 Dolphin 显示文件的大小为 1,0 KiB (1.031)。

x = BytesIO(self.file_to_import)
_logger.critical(x.getbuffer().nbytes)
df = pd.read_csv(x))

谁能告诉我为什么会这样?为什么dataframe 是空的?

【问题讨论】:

它看起来像一个base64 字符串。也许,你需要先解码才能使用:base64.decodebytes(s) @Corralien 是的,这就是问题所在,我没有意识到这个事实......非常感谢!将您的评论转换为答案,以便我将您的答案设置为正确的答案。 通常我会在这里删除 odoo 标签,但 odoo 会将文件转换为 base64,所以我可以使用标签 ;-) 【参考方案1】:

您的字符串是base64 编码的。使用前需要解码:

import base64

s = b"ZGVmYXVsdF9jb2RlO2...Jhcm87Owo="
s = base64.decodebytes(s)

【讨论】:

以上是关于使用 Python3 将 Bytes 对象转换为 Pandas 数据帧会产生一个空数据帧。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

无法将'bytes'对象隐式转换为str python

Python3 错误:TypeError:无法将“字节”对象隐式转换为 str

如何将“字节”对象转换为 Pandas Dataframe、Python3.x 中的文字字符串?

python3:字节与字节数组,并转换为字符串和从字符串转换

Python3的bytes和str之别

python3 str或bytes转换函数