pickle 保存 python对象

本文介绍了一种使用Python的openpyxl和pickle模块高效读取和写入Excel文件的方法。通过对Excel文件进行二进制序列化,实现了快速的数据读取过程。
import openpyxl
import pickle
import time

'''
target = r'c:/users/administrator/desktop/bill.xlsx'

wb = openpyxl.load_workbook(target)
sh = wb['空表']

nrows = 38 #sh.max_row
ncols = 24 #sh.max_column



with open(r'c:/users/administrator/desktop/excel.bin','ab') as buffer:
    for r in range(nrows):
        for c in range(ncols):
            obj = pickle.dumps(sh.cell(row = r+1,column=c+1))
            buffer.write(obj)
            
'''

wb = openpyxl.Workbook()
sh = wb.active

cells = []

start_time = time.time()
with open(r'c:/users/administrator/desktop/excel.bin','rb') as buffer:
    while True:
        try:
            obj = pickle.load(buffer)
            cells.append(obj)
        except:
            break
end_time = time.time()
print(end_time-start_time)
# 15s

 

<think>根据用户的问题,用户想了解使用Pythonpickle模块保存二进制文件的方法。结合提供的引用内容,我们可以总结出以下步骤: 1. **导入pickle模块**:使用`import pickle`语句。 2. **打开文件**:以二进制写入模式('wb')打开文件。 3. **序列化并写入**:使用`pickle.dump()`函数将Python对象序列化并写入文件。 4. **关闭文件**:完成写入后关闭文件。 另外,如果需要从二进制文件中读取数据: 1. 以二进制读取模式('rb')打开文件。 2. 使用`pickle.load()`函数反序列化文件内容,还原为Python对象。 引用中还提到,`pickle.dump()`可以指定序列化协议(protocol),默认是0(文本形式),还可以是1或2(二进制形式,且协议2更高效)。但通常我们使用默认的即可,或者使用`protocol=pickle.HIGHEST_PROTOCOL`选择当前环境支持的最高协议。 下面我将给出一个完整的示例,包括写入和读取,并解释注意事项。 ### 使用pickle保存和读取二进制文件 #### 保存列表到二进制文件 假设我们有一个列表`my_list = [123, 2.22, 'test', ['abc']]`,我们要将它保存为二进制文件。 ```python import pickle # 准备数据 my_list = [123, 2.22, 'test', ['abc']] # 以二进制写入模式打开文件 with open('mylist_pkl.pkl', 'wb') as file: # 序列化对象并写入文件 pickle.dump(my_list, file) ``` #### 从二进制文件读取数据 读取上面保存的文件: ```python import pickle # 以二进制读取模式打开文件 with open('mylist_pkl.pkl', 'rb') as file: # 反序列化文件内容 loaded_list = pickle.load(file) print(loaded_list) # 输出: [123, 2.22, 'test', ['abc']] ``` #### 注意事项 1. **文件模式**:必须使用二进制模式('wb'写入,'rb'读取)。 2. **安全性**:不要加载不信任来源的pickle文件,因为pickle在反序列化时可能执行任意代码。 3. **协议选择**:可以使用`protocol`参数指定协议,例如: ```python pickle.dump(my_list, file, protocol=pickle.HIGHEST_PROTOCOL) ``` 通常,协议版本越高,序列化的数据越小,处理速度越快,但要求Python版本支持。 4. **多次写入与读取**:如果同一个文件需要写入多个对象,可以多次调用`pickle.dump()`,读取时也要调用相同次数的`pickle.load()`,且顺序一致(如引用[3]所示)。 #### 保存自定义类的实例 引用[4]展示了如何保存和加载自定义类的实例。注意:在加载时,类定义必须在当前作用域中。 ```python import pickle class Person: def __init__(self, name, age): self.name = name self.age = age # 创建实例并保存 person = Person("John", 30) with open('person.pkl', 'wb') as f: pickle.dump(person, f) # 加载 with open('person.pkl', 'rb') as f: loaded_person = pickle.load(f) print(loaded_person.name) # 输出: John print(loaded_person.age) # 输出: 30 ``` ### 总结 使用pickle模块保存二进制文件主要步骤: 1. 导入pickle模块。 2. 以二进制模式打开文件(写入用'wb',读取用'rb')。 3. 使用`pickle.dump()`写入,使用`pickle.load()`读取。 4. 注意文件操作安全性和协议选择。 §§相关问题§§ 1. 如何选择pickle的协议版本? 2. pickle模块有哪些安全风险?如何避免? 3. 除了pickle,还有哪些Python模块可以用于序列化? 4. 如果遇到“pickle.PicklingError: Can't pickle <...>”错误,如何解决? </think> ### 使用Python pickle模块保存二进制文件的方法 `pickle`模块是Python标准库中用于序列化和反序列化对象的工具,可将Python对象转换为二进制格式存储。以下是详细操作步骤: #### 1. 基本保存步骤 ```python import pickle # 准备要保存的数据(支持列表、字典、类实例等) data = [1, 2.5, "文本", {"key": "value"}, [1,2,3]] # 以二进制写入模式打开文件 with open('data.pkl', 'wb') as file: # 'wb'表示二进制写入模式 # 序列化并保存数据 pickle.dump(data, file) # 默认使用最高效的二进制协议[^5] ``` #### 2. 自定义协议版本 可通过`protocol`参数控制序列化协议: ```python with open('data.pkl', 'wb') as file: # 使用最高效的二进制协议(推荐) pickle.dump(data, file, protocol=pickle.HIGHEST_PROTOCOL) # 通常为协议4 # 或指定具体协议: # 0: 文本格式(兼容旧版) # 1,2: 二进制格式 # 4: Python 3.4+ 的高效二进制 ``` #### 3. 保存自定义类实例 ```python class User: def __init__(self, name, age): self.name = name self.age = age user = User("张三", 30) with open('user.bin', 'wb') as f: pickle.dump(user, f) # 类定义需在加载时可访问[^4] ``` #### 4. 读取二进制文件 ```python with open('data.pkl', 'rb') as file: # 'rb'表示二进制读取模式 loaded_data = pickle.load(file) # 反序列化数据 print(loaded_data) # 输出: [1, 2.5, '文本', {'key': 'value'}, [1, 2, 3]] ``` #### 关键注意事项 1. **文件模式必须为二进制**:`'wb'`(写)和`'rb'`(读)[^2] 2. **安全性警告**:不要加载来源不可信的pickle文件,可能执行任意代码 3. **协议兼容性**:高版本协议生成的文件不兼容旧版Python 4. **多次写入/读取**:同一文件可多次`dump`,需对应次数`load`(按写入顺序读取)[^3] > **示例:保存并读取列表** > ```python > import pickle > my_list = [123, 2.22, 'test', ['abc']] > > # 写入 > with open('mylist.pkl', 'wb') as f: > pickle.dump(my_list, f) > > # 读取 > with open('mylist.pkl', 'rb') as f: > loaded_list = pickle.load(f) # [123, 2.22, 'test', ['abc']][^2] > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值