如何在Golang中解开python对象

时间:2018-02-12 16:26:36

标签: python go pickle

我有一个python程序,其中我使用Pickle来存储对象使用以下内容:

pickle.dump(sample, open( "Pickled_files/sample.p", "wb" )) 

我可以使用以下方法在Python中提取和取消对象:

sample_extracted= pickle.load(open( "Pickled_files/sample.p", "rb" ))

但是,我需要在Golang应用程序中提取此对象。因此,我需要知道在Golang中提取使用Python进行pickle的对象的方法。

有没有办法可以实现这一目标?如果是的话,如果有人能指出我的示例参考或示例,我将非常感激。

3 个答案:

答案 0 :(得分:3)

Pickle是Python特有的格式。 AFAIK在Python之外没有pickle-parser。您可以尝试为Go编写一个,但您很可能只会浪费大量时间和精神健康。另一方面,这确实是一个有趣的项目。

无论如何,而不是酸洗使用任何语言独立的格式,即xml,json,google的protobuf甚至是自定义格式,任何适合你的需求。总是选择工作的工具,从来没有其他方法。

答案 1 :(得分:1)

  

有没有办法可以实现这一目标?

取决于您对this的理解。除了Pickle之外,还有很多更好的选择 - 即使在纯Python环境中也是如此。如果你理解 this 在golang和Python之间交换数据,你应该考虑以下例子:

您可以在Python中序列化所有,例如

import msgpack
import msgpack_numpy as m
m.patch()
import numpy as np

data = {'string': 'Hello World',
        'number': 42,
        'matrix': np.random.randn(2, 3)}

with open('data.msgp', 'wb') as f:
    f.write(msgpack.packb(data, use_bin_type=True))

阅读它非常简单

// go get -u github.com/vmihailenco/msgpack

package main

import (
    "fmt"
    "github.com/vmihailenco/msgpack"
    "io/ioutil"
)

func main() {

    buf, err := ioutil.ReadFile("data.msgp")
    if err != nil {
        panic(err)
    }

    var out map[string]interface{}
    err = msgpack.Unmarshal(buf, &out)
    if err != nil {
        panic(err)
    }

    for k, v := range out {
        fmt.Printf("key[%v] value[%v]\n", k, v)
    }
}

这会给你

key[matrix] value[map[data:[145 106 174 12 61 187 235 63 128 225 138 214 167 154 231 191 156 205 144 51 50 116 244 191 251 147 235 33 187 149 251 63 207 56 134 174 206 146 220 63 7 23 246 148 34 235 226 63] type:[60 102 56] 
            kind:[] nd:true shape:[2 3]]]
key[string] value[[72 101 108 108 111 32 87 111 114 108 100]]
key[number] value[42]

剩下的就是将字节序列转换为您想要的对象。

答案 2 :(得分:0)

ogórek2)是Go库,用于解码/编码Python泡菜。

可以按以下方式在Go中加载保存到文件中的泡菜:

f, err := os.Open("Pickled_files/sample.p")

d := ogórek.NewDecoder(f)
obj, err := d.Decode()