泡菜编码 utf-8 问题

Pickle encoding utf-8 issue

提问人:Joel Porcaro 提问时间:7/14/2019 最后编辑:Joel Porcaro 更新时间:11/12/2023 访问量:12094

问:

我正在尝试将 pandas 数据帧腌制到我的本地目录中,以便我可以在另一个 jupyter 笔记本中处理它。起初,写入似乎很成功,但是当尝试在新的 jupyter 笔记本中读取它时,读取不成功。

当我打开我似乎写的泡菜文件时,该文件的唯一内容是:

错误!/Users/.../income.pickle 不是 UTF-8 编码的 保存已禁用。 有关更多详细信息,请参阅控制台。

我还检查了一下,泡菜文件本身只有几千字节。

这是我编写泡菜的代码:


with open('income.pickle', 'wb', encoding='UTF-8') as to_write:
    pickle.dump(new_income_df, to_write)

这是我阅读它的代码:


with open('income.pickle', 'rb') as read_file:
    income_df = pickle.load(read_file)

同样,当我返回income_df时,我得到以下输出:

系列([], dtype: float64)

这是一个空序列,我在尝试调用大多数序列方法时会出错。

如果有人知道解决这个问题,我全都听进去。提前致谢!

编辑:

这是我得出的解决方案:

with open('cleaned_df', 'wb') as to_write:
    pickle.dump(df, to_write)

with open('cleaned_df','rb') as read_file:
    df = pickle.load(read_file)

这比我预期的要简单得多

python 编码 utf-8 jupyter-notebook pickle

评论

1赞 Kaleb Coberly 2/12/2021
对于将来的搜索者,即使 Jupyter Notebook 无法直接显示 pickle 文件内容并显示“Error!<filepath> 未使用 UTF-8 编码 已禁用保存。有关更多详细信息,请参阅控制台。尝试解开物体并检查它。您可能会发现该物体完好无损。原来的海报在这方面很不走运,但这是一个单独的问题。

答:

0赞 Jennifer Yoon 7/14/2019 #1

酸洗通常用于存储原始数据,而不是传递 Pandas DataFrame 对象。当您尝试腌制它时,它只会存储顶级模块名称 Series。

1) 您只能将 DataFrame 中的数据写入 csv 文件。

# Write/read csv file using DataFrame object's "to_csv" method.
import pandas as pd
new_income_df.to_csv("mydata.csv")
new_income_df2 = pd.read_csv("mydata.csv")

2)如果您的数据可以作为函数保存在具有 *.py 名称的常规 python 模块中,则可以从 Jupyter 笔记本调用它。您也可以在更改内部值后重新加载函数。请参阅 autoreload ipynb 文档:https://ipython.org/ipython-doc/3/config/extensions/autoreload.html

# Saved as "mymodule1.py" (from notebook1.ipynb).
import pandas as pd
def funcdata():
    new_income_df = pd.DataFrame(data=[100, 101])
    return new_income_df

# notebook2.ipynb
%load_ext autoreload
%autoreload 2
import pandas as pd
import mymodule1.py
df2 = mymodule1.funcdata()
print(df2)
# Change data inside fucdata() in mymodule1.py and see if it changes here.

3) 您可以使用 %store 命令在 Jupyter 笔记本之间共享数据。
请参阅 src : https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/
和: 在 IPython Notebooks 之间共享数据

# %store example, first Jupyter notebook.
from sklearn import datasets
dataset = datasets.load_iris()
%store dataset

# from a new Jupyter notebook read.
%store -r dataset

评论

0赞 Joel Porcaro 7/14/2019
谢谢!我能够使用您提供的示例来解决我的问题。
0赞 Jennifer Yoon 7/14/2019
嗨,乔尔,太好了!我自己是一个新手程序员。想知道您的解决方案是什么吗?您可以编辑问题帖子,以显示适合您的内容。
0赞 Joel Porcaro 7/27/2019
实际上,解决方案非常简单。我在上面编辑了我的帖子供您查看。
0赞 Jennifer Yoon 8/2/2019
有趣。您似乎能够重新格式化 DataFrame 对象以将其保存为 pickle 二进制对象。('cleaned_df', 'WB')我必须尝试一下。祝您编码愉快。:-)
0赞 Gopal Sharma 6/11/2023 #2

使用这个:

movies = pd.read_pickle('cleaned_df')

加载腌制文件。