如何将数据存储到文件中?(涉及IT技术)

20

这个问题可能看起来有点基础,但我在互联网上找不到任何我能理解的东西。我如何存储使用dill模块pickle的对象?

我已经尝试了以下代码用于保存我的构造(一个包含自定义类的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进行pickle)一段时间后,我现在不再这样做。事实证明,不同的程序版本(包括可能存储在dill文件中的对象)可能导致无法恢复已经pickled的文件。现在我确保我想保存的所有内容都可以表示为一个字符串(尽可能高效地),实际上是一个可读的字符串。现在,我将我的数据存储为CSV格式。CSV单元格中的对象可以由JSON格式表示。这样,我就确保我的文件在未来的几个月和几年中都能被读取。即使代码发生改变,我也能够通过解析字符串重新编写编码器,并且通过手动检查CSV来理解它。


1
感谢您的编辑。我遇到了类似的问题。 - Peter Smit
@PeterSmit:我很高兴它有帮助!你可以点个赞 :-). - Make42
1个回答

35

直接将文件传入而不使用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) 
< p >序列化 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 语句的缩进后,文件也将被关闭。


我一直遇到以下错误:*** RecursionError: maximum recursion depth exceeded - alper
1
尝试增加限制:`import sys` `sys.setrecursionlimit(10_000)` - Mike Müller
如果我仍然面临相同的错误,增加10_000是否明智? - alper
只是试一下。如果你增加太多,你的程序会崩溃。看起来你有一个递归数据结构,比如一个包含自身的列表。你可能需要修复这个问题。 - Mike Müller
当我增加更多的零时,我是否应该再次添加“_”例如:“1_000_000”? - alper
@alper 像是要补充的是,这可能与你的代码无关,而是与‘pickle’有关的问题。参见:https://dev59.com/VHI95IYBdhLWcg3w1BlN - jda5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接