反序列化错误:调用Python对象时超过最大递归深度
我正试图通过将带有数据的CSV转换为json文件,然后使用loaddata将其输入Django,从而将装置加载到我的Django(1.4)应用程序中。但我一直得到一个最大递归深度错误。我环顾四周,它似乎与json文件中的非ASCII字符有关。但是,我很确定我没有那么做?这是我的密码:反序列化错误:调用Python对象时超过最大递归深度,python,django,Python,Django,我正试图通过将带有数据的CSV转换为json文件,然后使用loaddata将其输入Django,从而将装置加载到我的Django(1.4)应用程序中。但我一直得到一个最大递归深度错误。我环顾四周,它似乎与json文件中的非ASCII字符有关。但是,我很确定我没有那么做?这是我的密码: def csv_to_json(self,csv,dest,model,keys,sub): #keys is a dict formatted x:f where x = index of val
def csv_to_json(self,csv,dest,model,keys,sub):
#keys is a dict formatted x:f where x = index of value v;
#don't include pk
with open(csv) as f:
l = f.readlines()
right = len(l[0].split(","))
out = []
for x in xrange(1,len(l)):
if sub:
line = re.sub(", "," ",l[x])
line = re.sub(r'(,[\'\"*.]+|[\'\"*.]+,)','',l[x])
line = unicodedata.normalize('NFKD',unicode(line,'utf-8','ignore')).encode('ASCII','ignore')
line.encode('ASCII')
splt = line.split(",")
print len(splt)
if len(splt) == right:
for y in xrange(len(splt)):
if re.match(r'\d{4}-\d{2}-\d{2}',str(splt[y])):
splt[y] = int(splt[y][:4])
try:
if splt[y].isupper():
splt[y] = splt[y].title()
splt[y] = splt[y].rstrip()
except AttributeError:
continue
try:
splt[y] = int(splt[y])
except ValueError:
try:
splt[y] = float(splt[y])
except ValueError:
continue
d = {}
d["model"] = "dishes.%s"%(model)
d["pk"] = splt[0]
d["fields"] = {}
for k,v in keys.items():
print v,k
try:
d["fields"][v] = splt[k]
except IndexError:
continue
out.append(d)
with open(dest,"w") as f:
json_out = simplejson.dump(out,f,separators=(",",":"))
如您所见,我将CSV的内容简单地转换为UTF-8,目的是使用unicodedata删除它们的变音符号(我必须这样做,因为我在尝试使用loaddata加载它们时收到了“无效的连续字符”消息),但随后我将所有内容转换回ASCII。还是我?如果是,那么是什么导致了递归问题
ETA:以下是完整的错误消息:
Problem installing fixture
'/Users/samuelraker/django/menus/menus/dishes/fixtures/Classification.json':
Traceback (most recent call last):
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 190, in handle
for obj in objects:
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/json.py", line 47, in Deserializer
raise DeserializationError(e)
DeserializationError: maximum recursion depth exceeded while calling a Python object
重新编辑以进一步添加:
下面是我试图加载的一个JSON文件的片段
[
{
"pk":1,
"model":"dishes.dish",
"fields":{
"name":"Consomme printaniere royal"
}
},
{
"pk":2,
"model":"dishes.dish",
"fields":{
"name":"Chicken gumbo"
}
},
{
"pk":3,
"model":"dishes.dish",
"fields":{
"name":"Tomato aux croutons"
}
},
{
"pk":4,
"model":"dishes.dish",
"fields":{
"name":"Onion au gratin"
}
},
{
"pk":5,
"model":"dishes.dish",
"fields":{
"name":"St. Emilion"
}
},
{
"pk":7,
"model":"dishes.dish",
"fields":{
"name":"Radishes"
}
},
{
"pk":8,
"model":"dishes.dish",
"fields":{
"name":"Chicken soup with rice"
}
},
{
"pk":9,
"model":"dishes.dish",
"fields":{
"name":"Clam broth (cup)"
}
},
{
"pk":11,
"model":"dishes.dish",
"fields":{
"name":"Clear green turtle"
}
},
{
"pk":13,
"model":"dishes.dish",
"fields":{
"name":"Anchovies"
}
},
{
"pk":14,
"model":"dishes.dish",
"fields":{
"name":"Fresh lobsters in every style"
}
},
{
"pk":15,
"model":"dishes.dish",
"fields":{
"name":"Celery"
}
},
{
"pk":16,
"model":"dishes.dish",
"fields":{
"name":"Pim-olas"
}
},
{
"pk":17,
"model":"dishes.dish",
"fields":{
"name":"Caviar"
}
},
{
"pk":18,
"model":"dishes.dish",
"fields":{
"name":"Sardines"
}
},
{
"pk":19,
"model":"dishes.dish",
"fields":{
"name":"India chutney"
}
},
{
"pk":20,
"model":"dishes.dish",
"fields":{
"name":"Pickles"
}
},
{
"pk":21,
"model":"dishes.dish",
"fields":{
"name":"English walnuts"
}
},
{
"pk":22,
"model":"dishes.dish",
"fields":{
"name":"Pate de foies-gras"
}
},
{
"pk":23,
"model":"dishes.dish",
"fields":{
"name":"Pomard"
}
},
{
"pk":26,
"model":"dishes.dish",
"fields":{
"name":"Clams"
}
},
{
"pk":27,
"model":"dishes.dish",
"fields":{
"name":"Oysters"
}
},
{
"pk":28,
"model":"dishes.dish",
"fields":{
"name":"Claremont planked shad"
}
},
...
编辑3:节日快乐!我只是将其中一个JSON文件的一个小片段粘贴到一个单独的文件中,通过JSONLint运行它以确保安全,然后将其传递给loaddata…我得到了相同的错误消息。我的模型有问题吗
编辑4:所以我尝试将数据编码为YAML而不是JSON,但没有成功。伙计们,我真的被难住了。有人请帮忙
编辑5:我甚至尝试将我的db后端更改为django mysql pymysql(http://pypi.python.org/pypi/django-mysql-pymysql/0.1),但这也不起作用。任何人请?事实证明,问题是我的模型中有一个名为“pk”的字段,带有“primary\u key=True”。如果有一个Django的“保留字”列表就好了,因为我的错误似乎很容易犯,而且,如果不使用shell进行调试,很难抓住。我还遇到了以“_id”结尾的手动定义字段的问题,这也没有文档记录。您正在处理的这个/这些CSV文件有多大,它们的嵌套程度如何?其中有5个(每个模型一个),长度和行长各不相同。它们不是“嵌套的”,实际上——它们包含的信息比我计划在模型中使用的要多(因此代码中有dictionary参数),但每个值不超过一个数据。它到底在哪一行中断?如果您向我们提供一个您编写的示例JSON文件,这将非常有用。这似乎是正确的,即不包含无限递归,因为您可以反序列化它。Django的确切版本也会有所帮助。(旁注:不要将行读入列表并通过索引访问它们;
对于f中的行
就足以进行顺序访问了。)我添加了一个JSON文件的片段,以及我正在使用的Django版本(1.4)。我在这里真的很挣扎,几天后就要到最后期限了。