处理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'}]
问题原因
逻辑匹配完全颠倒
当前代码的逻辑是:遍历每个目标label(即文件名),然后在process_docs中遍历目录下所有文件,给所有文件统一打上当前循环的label。- 第一次循环label为
anime.pkl时,会把目录里的anime.pkl和manga.pkl都标记为anime.pkl的标签; - 第二次循环label为
manga.pkl时,又会把两个文件重新标记为manga.pkl的标签;
最终每个文件被重复处理两次,导致列表出现重复且标签错误的条目。
- 第一次循环label为
需求与实现错位
真实需求是每个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
相关产品推荐
相关产品推荐

