You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理Pickle文件时向列表追加字典出现重复结果,原因何在?

问题原因分析:Pickle文件处理后列表出现重复结果

问题背景

尝试将指定目录中两个Pickle文件的内容存入字典后追加到列表,目录仅包含两个.pkl文件,且Pickle序列化对象为列表类型,但执行代码后列表出现重复结果,实际输出与期望输出不符。

原代码

import os
import pickle
import pandas as pd


y_labels = ('anime.pkl', 'manga.pkl')


def process_docs(path, label):
    docs = os.listdir(path)
    data = []
    for doc in docs:
        with open(f'{path}/{doc}', 'rb') as f:
            text = pickle.load(f)
            data.append({'label': label, 'text': ' '.join(text)})
    return data


data = []
for label in y_labels:
    data.extend(process_docs('keywords', label))
df = pd.DataFrame(data)

实际输出

[{'label': 'anime.pkl', 'text': 'a b c'}, {'label': 'anime.pkl', 'text': '1 2 3'}] 
[{'label': 'manga.pkl', 'text': 'a b c'}, {'label': 'manga.pkl', 'text': '1 2 3'}]

期望输出

[{'label': 'anime.pkl', 'text': 'a b c'}, {'label': 'manga.pkl', 'text': '1 2 3'}]

问题原因

  1. 逻辑匹配完全颠倒
    当前代码的逻辑是:遍历每个目标label(即文件名),然后在process_docs中遍历目录下所有文件,给所有文件统一打上当前循环的label。

    • 第一次循环label为anime.pkl时,会把目录里的anime.pkl和manga.pkl都标记为anime.pkl的标签;
    • 第二次循环label为manga.pkl时,又会把两个文件重新标记为manga.pkl的标签;
      最终每个文件被重复处理两次,导致列表出现重复且标签错误的条目。
  2. 需求与实现错位
    真实需求是每个Pickle文件对应自身文件名作为标签,但当前代码的实现是给一批文件统一打同一个标签,完全违背了需求逻辑。

修正方案

调整逻辑,直接遍历目录中的文件,将文件名作为对应label即可:

import os
import pickle
import pandas as pd

def process_docs(path):
    data = []
    for doc in os.listdir(path):
        # 只处理.pkl文件
        if doc.endswith('.pkl'):
            with open(f'{path}/{doc}', 'rb') as f:
                text = pickle.load(f)
                data.append({'label': doc, 'text': ' '.join(text)})
    return data

data = process_docs('keywords')
df = pd.DataFrame(data)

内容的提问来源于stack exchange,提问作者ariyasas94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:47:25