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

批量反序列化文件夹pickle文件时触发FileNotFoundError的问题咨询

批量反序列化文件夹中多个Pickle文件的路径问题

问题背景

需要批量反序列化文件夹内约600个Pickle文件,不想手动逐个处理,但遍历代码触发路径错误。

初始代码

data_dirA = 'Data/FolderA'

for img in os.listdir(data_dirA):
    with open(img,'rb') as f:
        pickle.load(f)

报错信息

在Jupyter Notebook中触发FileNotFoundError:

1 for img in os.listdir(data_dirA):
----> 2     with open(img,'rb') as f:
      3         pickle.loads(f)

FileNotFoundError: [Errno 2] No such file or directory: '1.pck'

已尝试的单个文件处理方法

手动指定完整路径可以避免路径错误,但只能处理单个文件,需要手动修改文件名:

with open("Data/FolderA/1.pck", "rb") as f:
    img = pck.load(f)

注:此方法还会触发'pickle data was truncated'反序列化错误,本次仅聚焦路径问题

困惑点

知道如何遍历文件,但误以为反序列化必须基于文件名执行(若理解有误请指正)。

补充参考代码

for root, _, files in os.walk('Data/Intact'):
    for content in files:
        if not content.endswith('.pkl'):
            continue

        print(f"\n{root}/{content} data:")
        with open(f"{root}/{content}", 'r') as f:
            while 1:
                try:
                    print(pickle.load(f))
                except EOFError:
                    break

解决方案

核心问题:路径拼接错误

os.listdir()返回的只是文件名,不是完整路径,直接用open(img)会在当前工作目录查找文件,自然找不到目标文件夹里的文件。必须把文件夹路径和文件名拼接成完整路径。

修正后的代码

方法1:用os.path.join拼接路径(推荐,单文件夹场景)

import os
import pickle

data_dirA = 'Data/FolderA'

for filename in os.listdir(data_dirA):
    # 只处理Pickle格式文件,避免遍历无关文件
    if filename.endswith(('.pck', '.pkl')):
        full_path = os.path.join(data_dirA, filename)
        with open(full_path, 'rb') as f:
            try:
                data = pickle.load(f)
                # 这里可添加对data的处理逻辑,比如存入列表、分析数据等
                print(f"成功加载文件: {full_path}")
            except Exception as e:
                print(f"处理文件{full_path}时出错: {str(e)}")

方法2:用os.walk遍历(适合含子文件夹的场景)

如果目标文件夹下还有嵌套子文件夹,用os.walk可以递归遍历所有层级的Pickle文件:

import os
import pickle

root_dir = 'Data/FolderA'

for root, _, files in os.walk(root_dir):
    for filename in files:
        if filename.endswith(('.pck', '.pkl')):
            full_path = os.path.join(root, filename)
            with open(full_path, 'rb') as f:
                try:
                    data = pickle.load(f)
                    # 处理加载后的data
                    print(f"成功加载文件: {full_path}")
                except Exception as e:
                    print(f"处理文件{full_path}时出错: {str(e)}")

关于你的困惑

反序列化不需要“基于文件名执行”,只需要能正确打开包含Pickle数据的文件流即可。文件名只是用来定位文件的标识,核心是要提供正确的文件路径让open()能找到目标文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:50:20