我試圖通過將數據轉換爲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),但這也不起作用。任何人?請?
您正在處理的這些/這些CSV文件和它們的嵌套方式有多大? –
有5個(每個型號一個),長度和線長各不相同。它們並非「嵌套」,實際上它們包含的信息超出了我計劃在模型中使用的信息量(因此代碼中的字典參數),但每個值不超過一個數據。 – swizzard
它究竟在哪條線上折斷? –