Pickle 编码 utf-8 问题

问题描述 投票:0回答:2

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

当我打开我似乎已经编写的pickle文件时,该文件的唯一内容是:

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

我也查了一下,pickle 文件本身只有几千字节。

这是我编写pickle的代码:


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)

当我返回收入_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 encoding utf-8 jupyter-notebook pickle
2个回答
0
投票

Pickling 一般用于存储原始数据,而不是传递 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) 如果您的数据可以作为函数保存在常规 python 模块中,名称为 *.py,则可以从 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 Notebook 之间共享数据。
请参阅源代码:https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/
并且:在 IPython Notebook 之间共享数据

# %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
投票

使用这个:

movies = pd.read_pickle('cleaned_df')

加载腌制文件。

© www.soinside.com 2019 - 2024. All rights reserved.