我有一个列表列表,每个子列表看起来像这样:
a = [datetime.datetime(2012, 2, 1), datetime.datetime(2012, 2, 2), 'string', 4.00]
b = [datetime.datetime(2012, 3, 1), datetime.datetime(2012, 3, 4), 'another_string', 5.00]
list_of_lists = [a,b]
要腌制列表:
cPickle.dump(list_of_lists, open(filename, 'wb')) #filename defined
运行时,它会引发:
Traceback (most recent call last):
File "analyze_data.py", line 129, in <module>
analyze_data(sys.argv[1]) #because the dump runs inside a function
File "analyze_data.py", line 77, in analyze_data
cPickle.dump(list_of_lists, open(filename, 'wb'))
TypeError: 'datetime.datetime' object is not callable
我已经在 Python 2.7.3 和 2.6.8 上复制了该错误。
与常规泡菜相同的错误/回溯。此外,紧接在 cPickle.dump 之前的打印语句表明错误发生在这里而不是其他地方。
从文档中,听起来您可以 cPickle 嵌套对象,并非所有对象都必须是内置类型。也许我可以将所有日期时间对象更改为字符串。毫无疑问,有很多方法可以完成序列化,我可以调整代码以使上述问题不存在。但是,如果确实如此,我需要了解为什么这是不可能的。
谁能解释为什么嵌套的日期时间对象不能通过 cPickle/pickle 序列化?
编辑:酸洗上述数据结构在函数之外工作正常。里面,没有骰子。见下文。
def analyze_data(some_id, some_date=default_date): #some_id/some_date (datetime object) defined above
…
#create list_of_lists
…
string_date = some_date.strftime('%Y%m%d') #works
filename = '{0}_{1}.p'.format(some_id, string_date) #filename created fine
cPickle.dump(list_of_lists, open(filename, 'wb')) #kaboom
我将此函数映射到其他模块中的其他数据,因此理想情况下希望将酸洗保留在函数调用中。