2012-12-24 65 views
3

我試圖通過將數據轉換爲json文件將數據加載到我的Django(1.4)應用程序中,然後用loaddata將這些數據提供給Django。但我不斷收到最大遞歸深度錯誤。我環顧四周,它似乎被連接到json文件中的非ASCII字符。但是,我很確定我沒有這樣做?這裏是我的代碼:DeserializationError:調用Python對象時超出最大遞歸深度

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 ...並得到相同的darn錯誤消息。這可能是我的模型有問題嗎?

編輯4:所以我嘗試編碼我的數據作爲YAML而不是JSON,並沒有工作。我真的很難倒在這裏。有人請幫忙!編輯5:我甚至嘗試將我的數據庫後端更改爲django-mysql-pymysql(http://pypi.python.org/pypi/django-mysql-pymysql/0.1),但這也不起作用。任何人?請?

+0

您正在處理的這些/這些CSV文件和它們的嵌套方式有多大? –

+0

有5個(每個型號一個),長度和線長各不相同。它們並非「嵌套」,實際上它們包含的信息超出了我計劃在模型中使用的信息量(因此代碼中的字典參數),但每個值不超過一個數據。 – swizzard

+0

它究竟在哪條線上折斷? –

回答

2

原來,問題是我的模型中有一個名爲'pk'的字段,'primary_key = True'。如果Django有一個'保留字'的列表,那麼會很好,因爲我的錯誤似乎很容易做出來,而且,如果不使用shell進行調試,則很難捉摸。我也遇到了以「_id」結尾的手動定義字段的問題,該字段沒有記錄,AFAIK。

相關問題