PAYATHON 2026

如何从 pickle 二进制文件读取并使用 DataFrame?

数据阿明

结论

open() 返回文件对象,不能直接用列名从中取数据。先用 pickle.load() 从文件中恢复 DataFrame,再从中选取列。读取文件时使用 rb 模式。

保存数据时调用了 pkl.dump(df, f),读取时就对同一个文件调用 pkl.load(f):

import pickle as pkl
import pandas as pd

with open(bin_path, "rb") as f:
    df = pkl.load(f)

X = df[col_names[:-1]]
y = df[col_names[-1]]

这里,X 是包含除最后一列以外各列的 DataFrame,y 是最后一列的 Series。原代码中的 f[col_names[:-1]] 会报错,因为 f 是文件对象,不是加载后的数据表。

保存和读取示例

以下代码展示了数据的保存和读取过程。dataset_loc 应指向 pd.read_csv() 可以读取的数据文件。

import pickle as pkl
import pandas as pd

def create_dataset(path):
    df = pd.read_csv(path)
    saved_path = "some_path"

    with open(saved_path, "wb") as f:
        pkl.dump(df, f)

    return saved_path, df.columns.tolist()

def main():
    bin_path, col_names = create_dataset(dataset_loc)

    with open(bin_path, "rb") as f:
        df = pkl.load(f)

    X = df[col_names[:-1]]
    y = df[col_names[-1]]

如果在另一个运行过程或脚本中读取数据,需要先取得 bin_path 和列名列表。已知列名时,也可以在加载后直接选列,例如 X = df[["feature_a", "feature_b"]]、y = df["target"]。示例中的列名应替换为数据里的实际列名。

注意事项

  • wb 用于写入二进制文件,rb 用于读取。读取时不需要 +,通常无需使用 rb+。
  • 只有用 pickle 保存的内容,才能用 pickle.load() 读取。
  • 不要对来源不可信的 pickle 文件调用 pickle.load(),因为反序列化可能执行文件中包含的代码。

备注:内容仅供参考。