如何莳萝(腌)到文件?
这个问题似乎有点基本,但是无法在互联网上找到我所了解的任何内容。如何存储用莳萝腌制的东西?
为了保存我的构造(pandas DataFrame,它也包含自定义类),我走了这么远:
import dill
dill_file = open("data/2017-02-10_21:43_resultstatsDF", "wb")
dill_file.write(dill.dumps(resultstatsDF))
dill_file.close()
和阅读
dill_file = open("data/2017-02-10_21:43_resultstatsDF", "rb")
resultstatsDF_out = dill.load(dill_file.read())
dill_file.close()
但是我在阅读时出现错误
TypeError: file must have 'read' and 'readline' attributes
我该怎么做呢?
编辑以供将来的读者使用:
在使用这种方法(使我的DataFrame腌制)一段时间之后,现在我不再这样做了。事实证明,不同的程序版本(包括可能存储在莳萝文件中的对象)可能导致无法恢复已腌制的文件。现在,我确保要保存的所有内容都可以表示为字符串(尽可能有效),实际上是人类可读的字符串。现在,我将数据存储为CSV。CSV单元中的对象可能用JSON格式表示。这样,我可以确保在未来的几个月和几年中,我的文件都可读。即使代码发生更改,我也可以通过解析字符串来重写编码器,并且可以通过手动检查了解CSV。
-
只要给它不带
read
:的文件:resultstatsDF_out = dill.load(dill_file)
您也可以像这样莳萝文件:
with open("data/2017-02-10_21:43_resultstatsDF", "wb") as dill_file: dill.dump(resultstatsDF, dill_file)
所以:
dill.dump(obj, open_file)
直接写入文件。鉴于:
dill.dumps(obj)
序列化
obj
,您可以将其写入文件自己。同样地:
dill.load(open_file)
从文件读取,并且:
dill.loads(serialized_obj)
从序列化对象构造一个对象,您可以从文件中读取该对象。
建议使用该
with
语句打开文件。这里:
with open(path) as fobj: # do somdthing with fobj
具有与以下相同的效果:
fobj = open(path) try: # do somdthing with fobj finally: fobj.close()
离开
with
语句的缩进后,该文件将立即关闭,即使在例外情况下也是如此。