Python读取 npy, npz, h5, pkl 文件


我们在进行数据处理及分析时,常常会用到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')
  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值