3

我无法从 Google App Engine 中提取对象。我正在运行 Windows 7。这是程序:

  1. 创建一个 CSV,其中一个字段为pickle.dumps([[('CS', 2110), ('CS', 3300), ('CS', 3140)]]),或一些类似的参数。

CSV 看起来像这样:

INFO,2210,"CS 2110, 3300, 3140","(lp0
(lp1
(S'CS'
p2
I2110
tp3
a(g2
I3300
tp4
a(g2
I3140
tp5
aa."

CS,3110,CS 2110 or equivalent experience,"(lp0
(lp1
(S'CS'
p2
I2110
tp3
aa."

MSE,4102,"MATH 2210, 2230, 2310, or 2940","(lp0
(lp1
(S'MATH'
p2
I2210
tp3
a(g2
I2230
tp4
a(g2
I2310
tp5
aa(lp6
(g2
I2940
tp7
aa."

(是的,这些是\n由 s 生产的pickle.dumps()

  1. 将此文件加载到谷歌应用引擎开发服务器中:

appcfg.py upload_data --config_file="DataLoader.py" --filename="pre_req_data.csv" --kind=Course --url=http://localhost:8083/remote_api "appdir"

课程模式

class Course(db.Model):
    dept_code = db.StringProperty()
    number = db.IntegerProperty()
    raw_pre_reqs = db.StringProperty(multiline=True)
    original_description = db.StringProperty()

    def getPreReqs(self):
        pickle.loads(str(self.raw_pre_reqs))

数据加载器.py

class CourseLoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'Course',
                                   [('dept_code', str),
                                    ('number', int),
                                    ('original_description', str),
                                    ('raw_pre_reqs', str)
                                   ])

loaders = [CourseLoader]
  1. 确认数据加载成功:

数据存储个体实体

  1. 尝试解开:

    类 MainHandler(webapp.RequestHandler):

    def get(self):
        self.writeOut('cock!')
        self.writeOut('\n')
    
        courses = Course().all()
        for c in courses:
            self.writeOut("%s => %s" % (c.raw_pre_reqs, c.getPreReqs()))
    
    def writeOut(self, string):
        self.response.out.write(string)
    
  2. 观察错误:

    回溯(最近一次通话最后):

    文件“C:\Program Files\Google\google_appengine\google\appengine\ext\webapp__init__.py”,第 511 行,调用 handler.get(*groups)

    文件“main.py”,第 30 行,在 get self.writeOut("%s => %s" % (c.raw_pre_reqs, c.getPreReqs()))

    文件“src\Models.py”,第 17 行,在 getPreReqs pickle.loads(str(self.raw_pre_reqs))

    文件“C:\Python26\lib\pickle.py”,第 1374 行,加载返回 Unpickler(file).load()

    文件“C:\Python26\lib\pickle.py”,第 858 行,在加载调度键中

    文件“C:\Python26\lib\pickle.py”,第 966 行,在 load_string 中引发 ValueError,“insecure string pickle”

    ValueError:不安全的字符串泡菜

我在这里做错了什么?

4

2 回答 2

4

Pickle 是一种二进制格式,而 CSV 不是二进制安全的。你需要对你的泡菜进行编码——比如,使用 base64.b64encode——如果你想以文本格式传输它。

于 2010-06-03T10:08:02.213 回答
2

Pickle 可以是二进制格式,但默认情况下它是完全 ASCII 安全的(协议 0)。阅读 pickle 文档了解详情:pickle.dump

它通常会有换行符,因此在使用基于行的格式(如 CSV)时必须考虑到这一点。

如果您正在阅读其他人的 pickle,他们可能使用了二进制协议,但您粘贴的输出看起来像正常的 pickle。

于 2010-10-25T18:31:36.337 回答