当我泡菜时,有人可以解释 'with open()' 的每个组件在做什么吗?
Can someone give an ELI5 explanation of what each component of 'with open()' is doing when I pickle?
我已经多次使用这种语法来 pickle 一个文件,但事实是我不明白实际发生了什么。我只知道它给了我想要的结果。
with open('some_model_name.pickle', 'wb') as to_write:
pickle.dump(some_model_object, to_write)
但实际上发生了什么?如果我不指定 wb
怎么办?什么是 as to_write
?
与我读回我的模型时相同:
with open(path+'some_model_name.pickle', 'rb') as to_read:
some_model_object = pickle.load(to_read)
“wb”是 shorthand 表示“以二进制模式写入”。如果您不指定“wb”,您将获得 open
的默认模式,该模式以文本模式读取。在这种情况下,对 pickle.dump
的调用将失败,因为文件是在 read-only 模式下打开的,并且您尝试写入一些字节。
绑定as to_write
意味着将open
调用的return-value分配给一个名为to_write
的局部变量。在不使用上下文管理器(“with 语句”)的情况下做同样事情的类似方法可能如下所示:
try:
to_write = open('some_model_name.pickle', 'wb')
pickle.dump(some_model_object, to_write)
finally:
to_write.close()
这是一个简化版本,在此答案末尾的文档 link 中给出了更完整的等效版本。
问题中显示的第二个 code-block 类似,只是它以“读取二进制”模式“rb”打开文件“some_model_name.pickle”,这是合适的,因为 pickle.load
这里使用(读字节)代替pickle.dump
(写字节)。
我描述的部分的相关文档link:
我已经多次使用这种语法来 pickle 一个文件,但事实是我不明白实际发生了什么。我只知道它给了我想要的结果。
with open('some_model_name.pickle', 'wb') as to_write:
pickle.dump(some_model_object, to_write)
但实际上发生了什么?如果我不指定 wb
怎么办?什么是 as to_write
?
与我读回我的模型时相同:
with open(path+'some_model_name.pickle', 'rb') as to_read:
some_model_object = pickle.load(to_read)
“wb”是 shorthand 表示“以二进制模式写入”。如果您不指定“wb”,您将获得 open
的默认模式,该模式以文本模式读取。在这种情况下,对 pickle.dump
的调用将失败,因为文件是在 read-only 模式下打开的,并且您尝试写入一些字节。
绑定as to_write
意味着将open
调用的return-value分配给一个名为to_write
的局部变量。在不使用上下文管理器(“with 语句”)的情况下做同样事情的类似方法可能如下所示:
try:
to_write = open('some_model_name.pickle', 'wb')
pickle.dump(some_model_object, to_write)
finally:
to_write.close()
这是一个简化版本,在此答案末尾的文档 link 中给出了更完整的等效版本。
问题中显示的第二个 code-block 类似,只是它以“读取二进制”模式“rb”打开文件“some_model_name.pickle”,这是合适的,因为 pickle.load
这里使用(读字节)代替pickle.dump
(写字节)。
我描述的部分的相关文档link: