不能pickle文件对象,因其依赖操作系统文件描述符,不具备可移植性。应保存文件内容或路径:读取内容后用pickle序列化数据,或仅保存路径字符串供后续使用。

Python 中的 pickle 模块用于将 Python 对象序列化为字节流,以便保存到文件或在网络中传输。但需要注意的是,不能直接使用 pickle 序列化文件对象本身(比如通过 open() 打开的文件句柄),因为文件对象是与操作系统资源相关联的运行时资源,无法被安全地保存和恢复。
为什么不能 pickle 文件对象?
当你尝试对一个打开的文件对象执行 pickle.dumps(file_obj) 时,会抛出异常:
TypeError: cannot pickle ‘_io.TextIOWrapper’ objects
这是因为:
文件对象依赖于底层的操作系统文件描述符该描述符在不同机器或进程间不具备可移植性序列化后无法保证能重新建立相同的连接状态
如何正确处理需要保存的文件数据?
如果你希望保存“文件相关内容”,应该转换思路:不是保存文件对象,而是保存其内容或路径信息。
立即学习“Python免费学习笔记(深入)”;
JSON.NET 简单的使用 中文WORD版
本文档主要讲述的是JSON.NET 简单的使用;JSON.NET使用来将.NET中的对象转换为JSON字符串(序列化),或者将JSON字符串转换为.NET中已有类型的对象(反序列化?)。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
0 查看详情
保存文件内容:读取数据后用 pickle 保存内容保存文件路径:只保存文件路径字符串,后续再用路径打开
示例:保存并恢复文本内容
import pickle
# 写入数据
with open(‘data.txt’, ‘w’) as f:
f.write(‘Hello, world!’)
# 读取内容并序列化
with open(‘data.txt’, ‘r’) as f:
text = f.read()
# 使用 pickle 保存内容
with open(‘saved_data.pkl’, ‘wb’) as pkl_file:
pickle.dump(text, pkl_file)
# 反序列化
with open(‘saved_data.pkl’, ‘rb’) as pkl_file:
restored_text = pickle.load(pkl_file)
print(restored_text) # 输出: Hello, world!
替代方案建议
根据实际需求选择合适方式:
要持久化配置或中间结果 → 直接用 pickle 保存数据结构(如 dict、list)需记录原始文件来源 → 保存文件路径字符串 + 元数据处理大文件流 → 分块读取处理,避免内存溢出
基本上就这些。pickle 很强大,但只适用于可序列化的 Python 对象,不包括运行中的 I/O 资源。理解这一点能避免常见陷阱。
以上就是Python 使用 pickle 序列化文件对象的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/908835.html
微信扫一扫
支付宝扫一扫