我们在进行数据处理及分析时,常常会用到CSV文件。当CSV文件中数据量较大时,处理数据的速度非常慢,且所占存储空间大。这时,我们可以考虑将原始CSV数据存储为 npz, h5 及 pkl 的形式,从而大大提升读取速度 。
1. npy文件
numpy能够读写磁盘上的文本数据或二进制数据。
np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中。
(1) 存储为npy文件
np.save函数可将 单个数组 以二进制格式保存到文件中.
import numpy as np
data = np.arange(5)
np.save('test.npy', data)
(2) 读取npy文件
data = np.load('test.npy')
2. npz文件
如果想将多个数组保存到一个文件中的话,可以使用 np.savez 函数。
savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, …。
savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。
(1) 存储为npz文件
import numpy as np
a = np.arange(5)
b = np.arange(6)
c = np.arange(7)
np.savez('test.npz', a, b=b, c_array=c)
(2) 读取npz文件
np.load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容.
data = np.load('./test.npz') # 使用np.load加载
查看npz文件中包含哪些数据字典
print(data.files)
# ['b', 'c_array', 'arr_0'] 分别对应于数组 b, c, a
查看npz文件中的数据字典的shape
print(data['arr_0'].shape) # (5,)
print(data['b'].shape) # (6,)
print(data['c_array'].shape) #(7,)
3. h5文件
HDF5文件适合于大量异构数据的内部文件状结构的压缩格式。对于某些数据结构,其大小和访问速度都非常惊人。
(1) 存储为npz文件
# 将数据帧导出到hdf
df.to_hdf(path_or_buf, key, mode, complevel, complib, append ...)
to_hdf () 中比较有用的几个参数:
- path_or_buf – 文件路径或HDFStore对象;
- key(键)– 已识别或存储区中的组;后面可以根据key来索引
- mode(模式)– 写入,追加或读取追加;
- format(格式) – fixed 用于快速读写,而 table 仅允许选择数据的子集。
将CSV文件转化为h5文件
import pandas as pd
data = pd.read_csv('./test.csv', header=None)
data.to_hdf('test.h5', key='df')
(2) 读取h5文件
data = pd.read_hdf('./test.h5')
print(data.shape)
4. pkl文件
可以对以下数据类型来pickle对象:布尔值,整数,字符串,元组,列表,集合,和获取可选对象的字典。
pickle 的优点:
- 比 CSV 更快(取决于压缩方法,写入CSV的5–300%和读取CSV的15–200%)
- 生成的文件更小(约为CSV的50%)
- 保留有关数据类型的信息(100%)
- 无需指定过多的参数
(1) 存储为pkl文件
import pickle
objects = {'a':[4,2,1.5,1], 'b':[32,[101],17], 'x':True, 'y':False}
# 写法1
with open('test.pkl', 'wb') as f:
pickle.dump(objects, f)
# 写法2
pickle.dump(objects, open('test.pkl', 'wb'))
(2) 读取pkl文件
# 写法1
with open('test.pkl', 'rb') as f:
data = pickle.load(f)
# data = pickle.load(f, encoding='latin1') # 防止出现编码不一致报错问题
# 写法2
data = pickle.load(open('test.pkl','rb'))
print(data)
# {'a': [4, 2, 1.5, 1], 'b': [32, [101], 17], 'x': True, 'y': False}
(3) 使用Pandas操作DataFrame的pickle序列化
import pandas as pd
data = pd.DataFrame([range(11), range(100,110)], columns=list('abcdefghijk'))
data.to_pickle('test.pkl')
pkl_data = pd.read_pickle('test.pkl')
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/162876.html