python对.pkl文件的操作

本文介绍了如何使用Python的pandas和pickle库进行数据的序列化与读取,包括神经网络模型的保存与加载,以及pandas DataFrame的to_pickle和read_pickle操作。还展示了loc和iloc在数据筛选上的应用,以及set_index、reset_index和数据清洗等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.pkl文件

pkl文件是python里面保存文件的一种格式,如果直接打开会显示一堆序列化的东西(二进制文件)。
常用于保存神经网络训练的模型或者各种需要存储的数据。

  1. 保存神经网络训练模型举例(使用pytorch进行保存)
    保存整个网络:torch.save(net, ‘net.pkl’)
    保存网络的状态信息:torch.save(net.state_dict(), ‘net_params.pkl’)
    提取神经网络的方法:
    torch.load(‘net.pkl’)
  2. 存储数据举例
import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(20).reshape(4,5))
df.to_pickle('foo.pkl')
data=pd.read_pickle('foo.pkl')
print(data)

输出为:

    0   1   2   3   4
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19

2.pickle库对文件进行写入,读取操作

  1. 写入pkl文件
import pickle
#wb是覆盖写,如果需要追加,则为‘ab'
f = open('data.pkl','wb')
#待写入数据
datas = {'name':'Bruce','age':25,'high':175}
#写入
data= pickle.dump(datas,f,-1)
#关闭文件
f.close()
  1. 读取.pkl文件
f = open('data.pkl','rb')
#使用load的方法将数据从pkl文件中读取出来
pickle.load(f)
#关闭文件
f.close()

3.pandas库对文件进行写入,读取操作

  1. 写入.pkl文件:

使用DataFrame的to_pickle就可以生成pickle文件,因此如果需要存储其他类型的数据将其转化为DataFrame即可存取,例如将dict类型数据保存在.pkl文件中

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(20).reshape(4,5))
#使用DataFrame的to_pickle就可以生成pickle文件
df.to_pickle('data.pkl')
#通过字典创建数据
dic={'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]}
df2 = pd.DataFrame(dic,index=["a","b","c"])
df2.to_pickle('data2.pkl')

#字典的键和值将转换为DataFrame的两列,其列名如选项列中所给
stu = {
     'xiaoming':2,
     'xiaohong':3,
    'xiaoqiang':7,}

print(pd.DataFrame(list(stu.items()),columns=['name', 'age']))
'''
输出结果为:
         name   age
0     xiaoming   2
1     xiaohong   3
2     xiaoqiang  7
'''
  1. 读取.pkl文件:
data=pd.read_pickle('data.pkl')
data2=pd.read_pickle('data2.pkl')
print('data:\n',data)
print('data2:\n',data2)

输出为

data:
     0   1   2   3   4
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19
data2:
    A  B  C
a  1  4  7
b  2  5  8
c  3  6  9

4.pandas库常用函数及其作用

  1. loc和iloc(截取特定数据)
    https://blog.csdn.net/qq1483661204/article/details/77587881
    https://blog.csdn.net/htbeker/article/details/80332360
    除了通过标签和索引进行选择某一行(列)或者区域的数据,还可以完成符合条件的数据选取。

1.根据指定的索引列表查找

import pandas as pd
dic={'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]}
df = pd.DataFrame(dic,index=["a","b","c"])
print('data:\n',df)
ids=[0,2]
data=df.iloc[ids]
print('choose\n',data)

data:
    A  B  C
a  1  4  7
b  2  5  8
c  3  6  9
choose
    A  B  C
a  1  4  7
c  3  6  9

2.根据指定的**行列标签(不是索引)**进行查找

import pandas as pd
dic={'A':[1,2,3],'B':[4,5,6],'C':[7,5,7]}
df = pd.DataFrame(dic)
print('data:\n',df)
data=df.loc[0,'A']
print(data)
dic1={'A':[1,2,3],'B':[4,5,6],'C':[7,5,7]}
df1 = pd.DataFrame(dic1,index=['a','b','c'])
print('data:\n',df1)
data1=df1.loc['a','A']
print(data1)
data:
    A  B  C
0  1  4  7
1  2  5  5
2  3  6  7
1
data:
    A  B  C
a  1  4  7
b  2  5  5
c  3  6  7
1

3.根据判断条件查找

dic1={'A':[1,2,3],'B':[4,5,6],'C':[7,5,7]}
df1 = pd.DataFrame(dic1,index=['a','b','c'])
print('data:\n',df1)
print('-------------------')
data1=df1.loc[df1['B']==4,'C']
print(data1)
data:
    A  B  C
a  1  4  7
b  2  5  5
c  3  6  7
-------------------
a    7
Name: C, dtype: int64
  1. .unique(去除重复元素,行列写法不同)
import pandas as pd
dic={'A':[1,2,3],'B':[4,5,6],'C':[7,5,7]}
df = pd.DataFrame(dic,index=["a","b","c"])
print('data:\n',df)

print('\n.unique:(列)\n',df['C'].unique())
#.loc默认逗号分隔,逗号前是行,逗号后是列
print('\n.unique:(行)\n',df.loc['b'].unique())
print('\n.unique:(列)\n',df.loc[:,'C'].unique())
data:
    A  B  C
a  1  4  7
b  2  5  5
c  3  6  7

.unique:()
 [7 5]

.unique:()
 [2 5]

.unique:()
 [7 5]
  1. set_index和reset_index(设置索引)
    https://blog.csdn.net/jingyi130705008/article/details/78162758
  2. drop(删除数据)
    https://www.cnblogs.com/wodexk/p/10316674.html
  3. .merge(DataFrame对象拼接)
    https://blog.csdn.net/brucewong0516/article/details/82707492
  4. Series(常用数据结构)
    pandas两个主要的数据结构:Series和DataFrame。
    Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。
from pandas import Series,DataFrame
data = Series([9,23,3,56])
print(data)

输出索引在左,数值在右。在没有指定具体的索引时,则自动创建一个0~N-1的整数型索引

0     9
1    23
2     3
3    56
dtype: int64

可以通过Series的values和index属性获取数组的值和索引

print('data.values',data.values)
print('data.index',data.index)
data.values [ 9 23  3 56]
data.index RangeIndex(start=0, stop=4, step=1)

pandas的isnull和notnul或者实例方法data.isnull()可用于检测缺失数据:

import pandas as pd
from pandas import Series,DataFrame
dict={'a':1000,
      'b':900,
      'c':800}
data=Series(dict)
index=['a','b','d']
#根据字典和给出的索引创建Series
data2=Series(dict,index)
print('-'*20)
print('data\n',data)
print('-'*20)
print('data2\n',data2)
print('-'*20)
print('isnull\n',pd.isnull(data2))
print('-'*20)
print('notnull\n',pd.notnull(data2))
print('-'*20)
print('data2.isnull\n',data2.isnull())
--------------------
data
 a    1000
b     900
c     800
dtype: int64
--------------------
data2
 a    1000.0
b     900.0
d       NaN
dtype: float64
--------------------
isnull
 a    False
b    False
d     True
dtype: bool
--------------------
notnull
 a     True
b     True
d    False
dtype: bool
--------------------
data2.isnull
 a    False
b    False
d     True
dtype: bool

参考链接:
https://zhuanlan.zhihu.com/p/32190141

03-08
### Python pkl 文件格式概述 pkl 文件是一种用于序列化和反序列化 Python 对象的数据存储格式。通过 Pickle 库,可以方便地保存复杂的 Python 数据结构到磁盘上,并能在后续加载这些对象以便继续使用[^1]。 #### pkl 文件的优点与缺点 优点在于能够直接保存几乎任何类型的 Python 对象,包括自定义类实例;而缺点则是安全性较低——不应从未受信任的源加载 pickle 数据,因为这可能导致执行任意代码[^2]。 ### 使用方法 为了创建或读取 .pkl 文件,在 Python 中主要依赖 `pickle` 或更高效的第三方库如 `mmengine` 来完成相应的功能实现。 #### 写入 (保存) pkl 文件 下面展示如何将一个字典对象保存成名为 'data.pkl' 的文件: ```python import pickle example_dict = {'key': 'value'} with open('data.pkl', 'wb') as file: pickle.dump(example_dict, file) ``` 这段代码首先导入了必要的模块,接着准备了一个简单的字典作为待保存的对象。最后利用上下文管理器打开目标路径下的二进制模式 ('wb') 文件流,并调用了 `pickle.dump()` 方法来序列化给定的对象至该文件中[^4]。 #### 读取 pkl 文件 当需要从已有的 .pkl 文件恢复之前保存过的 Python 对象时,则可以通过如下方式来进行: ```python import pickle with open('data.pkl', 'rb') as file: loaded_object = pickle.load(file) print(loaded_object) ``` 这里同样采用了上下文管理器确保资源被正确释放,并指定了只读且为二进制模式 ('rb') 打开文件。之后借助于 `pickle.load()` 函数实现了对原对象状态的重建并打印出来验证结果是否一致。 ### 注意事项 - **安全风险**:由于存在潜在的安全隐患,建议仅限于内部环境或是完全可控的情况下才考虑采用此格式交换数据。 - **版本兼容性**:不同版本间的 Python 解释器可能无法互相理解对方生成的 pickled 流,因此应尽量保持一致性。 - **跨平台支持**:虽然大多数情况下可以在 Windows 和 Unix 类系统间正常工作,但仍需注意某些特定操作系统特性可能会引起差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值