反序列化错误:调用Python对象时超过最大递归深度

3

我试图通过将包含数据的CSV文件转换为json文件,并使用loaddata将其馈送到Django中,来将fixture加载到我的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 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。或者说我确实这样做了吗?如果是这样,那么是什么导致了递归问题呢?

预计到达时间:以下是完整的错误消息:

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:我甚至尝试将我的数据库后端更改为django-mysql-pymysql(http://pypi.python.org/pypi/django-mysql-pymysql/0.1),但也没有起作用。有人可以帮忙吗?

你正在处理的CSV文件有多大?它们有多少层嵌套? - Density 21.5
有五个模型(每个模型一个),长度和行长度各不相同。它们并不是真正的“嵌套”-它们包含比我计划在我的模型中使用更多的信息(因此代码中的字典参数),但每个值最多只有一个数据。 - swizzard
它在哪一行准确地中断了? - Density 21.5
如果您提供一个您编写的JSON文件的样例会很有帮助。它似乎是正确的,即不包含无限递归,因为您可以反序列化它。Django的确切版本也会很有帮助。(另外一件事:不要将行读入列表中,并通过索引访问它们;for line in f足以进行顺序访问。) - 9000
我添加了一个JSON文件的片段,以及我正在使用的Django版本(1.4)。我在这里真的很困难,而且截止日期还有几天。 - swizzard
1个回答

2

事实证明,问题出在我的模型中有一个名为“pk”的字段,并且设有“primary_key=True”。如果Django有一个“保留字”列表,那就太好了,因为我的错误似乎很容易犯,并且如果不使用shell进行调试,就很难发现。我还遇到了手动定义的以“_id”结尾的字段的问题,这也没有被记录在文档中,至少我是这么认为的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接