GAE:值错误:字符串pi不安全

2024-10-03 11:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在从谷歌应用引擎中取消拾取对象时遇到问题。我正在运行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."

(是的,它们是由pickle.dumps()产生的\n

  1. 将此文件加载到google app engine开发服务器:

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

课程模式

^{pr2}$

数据加载程序.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. 确认数据已成功加载:

data storeindividual entity

  1. 试着解开:

    类主处理程序(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_UuInit_Uu.py”,第511行,在调用 处理程序.get(*组)

    “文件”主.py“,第30行,在get中 自写(“%s=>;%s”%(c.raw_pre_reqs,c.getPreReqs())

    文件“src\模型.py,第17行,在getPreReqs中 酸洗负荷(结构(自身原始需求))在

    文件“C:\Python26\lib\泡菜.py“,第1374行,荷载 返回Unpickler(file).load()

    文件“C:\Python26\lib\泡菜.py“,第858行,负载 调度键

    文件“C:\Python26\lib\泡菜.py“φ 引发值错误,“字符串pickle不安全”

    值错误:字符串pickle不安全

我做错什么了?


Tags: 文件pyselfdefcsprepickleaa
2条回答

Pickle是二进制格式,CSV不是二进制安全的。如果您想在文本格式中传输pickle,那么需要对pickle进行编码,比如使用base64.b64encode。在

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

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

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

相关问题 更多 >