0

这是我的功能:

def pickleIt(file_name,data):
   try:
        with open(file_name+".pickle", "wb") as output_file:
            pickle.dump(data, output_file,-1)
        output_file.close()
    except Exception,e:
        print "Cannot open the file:",file_name,e
    return 

当我腌制字典或列表时它工作正常,但它不适用于字典列表。我从另一个函数中获取字典single_record,然后将其附加到我的列表中:

def set_dict(url.....)
     single_record={'url':url,
                    'title':song_obj.getSongTitle(),
                    'name':song_obj.getPerformer(),
                    'author':song_obj.getAuthors(),
                    }
     return single_record

当我尝试转储 50 个字典的列表时,我收到以下错误:

maximum recursion depth exceeded

任何人都可以帮忙找出问题所在吗?

4

1 回答 1

2

您收到“超出最大递归深度”的错误意味着您的调用堆栈太深。调用堆栈的深度基本上是从初始调用点(类似于您的主函数/循环)调用了多少函数而没有返回。

因此,例如,如果您从初始呼叫点呼叫func1(). func1()当前深度为 1。如果在func1()返回之前调用另一个函数,则该函数中的深度将为 2。

要找出调用堆栈调用大小的当前限制sys.getrecursionlimit()并更改它,请调用sys.setrecursionlimit().

如果在腌制代码时抛出错误,那么很可能,您尝试腌制的结构具有太多嵌套元素。这是因为,dump/dumps将在被转储的结构中的容器上递归。意思是,如果你要转储一个列表,它会转储列表中的每个元素,这些元素本身可能是一个列表或字典,所以它会转储那些第一个元素,依此类推。如果元素嵌套太深(列表或字典,其中包含列表或字典,当无限包含列表或字典时),那么在某些时候您将达到最大递归深度。

问题可能出在其他地方,但没有任何进一步的细节,这是唯一可能导致的事情(如果确实是引发错误的地方)。

我试过腌制一个包含 1000 个字典的列表(在结构上与你的相似),它工作得很好。因此,要么您无意中构建了一个过于嵌套的结构,要么在调用picke.dump()

编辑:

试试这个函数,看看你试图转储的结构是如何嵌套的:

def nestedness(struct):
    if isinstance(struct, list):
        return max([0] + [nestedness(i) for i in struct]) + 1
    if isinstance(struct, dict):
        return max([0] + [nestedness(i) for i in struct.values()])+1
    return 1

如果超出最大递归深度而失败,请继续使用它,sys.setrecursionlimit()直到得到正确的答案。如果您的结构过于嵌套,请查看是否可以通过不同的结构来减少嵌套。

编辑:为了后代,固定嵌套,因此它处理空的字典和序列

于 2013-02-23T22:11:26.890 回答