首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到MARK

找不到MARK
EN

Stack Overflow用户
提问于 2018-07-27 22:57:37
回答 3查看 2.8K关注 0票数 7

下面是我的Python代码:

代码语言:javascript
复制
parser = argparse.ArgumentParser()
parser.add_argument('--use_model', type=str, help='model location', required=True)
parser.add_argument('--model_dim', type=int, help='model dimension of words', required=True)
args = parser.parse_args()
f = open(args.use_model, "rb")
f.seek(0)
trained_model = pickle.load(f)

我在最后一行得到_pickle.UnpicklingError: could not find MARK错误。

在这个问题中:

_pickle.UnpicklingError: could not find MARK

它说f.seek(0)解决了这个问题,但在我的例子中没有。

EN

回答 3

Stack Overflow用户

发布于 2021-02-07 23:42:30

看看下划线模块的源代码(用C编写),只有一个地方会出现这样的错误:

代码语言:javascript
复制
static Py_ssize_t
marker(UnpicklerObject *self)
{
    Py_ssize_t mark;

    if (self->num_marks < 1) {
        PickleState *st = _Pickle_GetGlobalState();
        PyErr_SetString(st->UnpicklingError, "could not find MARK");
        return -1;
    }
...
}

在底层,pickle模块使用标记堆栈取消对容器对象的筛选,而num_marks指示其中有多少对象。通过初始化Unpickler函数,num_marks被设置为0,然后在新的标记推入标记堆栈时递增。

获取此错误的一种可能方法是更改帧操作码(指示帧开始的值)或标记操作码。假设我们使用协议4(从这个版本开始,pickle具有二进制成帧功能),您可以在pep 3154中阅读更多内容。这个想法简单明了--将所有内容分成块(框架),并标记每个框架的边界。让我们深入研究一下吧。

考虑这个例子:

代码语言:javascript
复制
import pickle
data = {"fruits": ["apple", "banana", "pineapple"] }

with open("data.pickle", 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

让我们用pickletools来研究一下

代码语言:javascript
复制
python -m pickletools data.pickle
    0: \x80 PROTO      5
    2: \x95 FRAME      46
   11: }    EMPTY_DICT
   12: \x94 MEMOIZE    (as 0)
   13: \x8c SHORT_BINUNICODE 'fruits'
   21: \x94 MEMOIZE    (as 1)
   22: ]    EMPTY_LIST
   23: \x94 MEMOIZE    (as 2)
   24: (    MARK
   25: \x8c     SHORT_BINUNICODE 'apple'
   32: \x94     MEMOIZE    (as 3)
   33: \x8c     SHORT_BINUNICODE 'banana'
   41: \x94     MEMOIZE    (as 4)
   42: \x8c     SHORT_BINUNICODE 'pineapple'
   53: \x94     MEMOIZE    (as 5)
   54: e        APPENDS    (MARK at 24)
   55: s    SETITEM
   56: .    STOP
highest protocol among opcodes = 4

在这里,FRAME (0x95)表示新帧的开始位置,而MARK ('(') )表示容器对象的开始,这些值由协议指定(这是一个实现细节)。

我首先看一下pickle文件的内容,总结一下,问题的原因可能是:

corrupted.

  • The
  1. 文件不知道怎么回事,文件指针不指向文件的开头,很可能可以通过f.seek(0)修复,请参阅_pickle.UnpicklingError: could not find MARK ...

找到另一个原因了?请随意编辑答案。

票数 0
EN

Stack Overflow用户

发布于 2021-10-27 13:40:40

我最近也犯了同样的错误。一个完美工作的代码突然决定抛出这个错误。

文件损坏是原因: git已将CRLF替换为LF。

我重新下载了这个文件并解决了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2021-12-19 14:49:59

我也遇到了同样的问题,这是由于在一个实际上不是pickle文件的文件上使用pandas read_pickle()引起的……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51560625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档