python保存大型 .mat 数据文件报错超出 IO 限制的操作


Posted in Python onMay 10, 2021

python 保存 .mat 文件的大小是有限制的,似乎是 5G 以内,如果需要保存几十个 G 的数据的话,可以选用其他方式,

比如 h5 文件

import h5py
def h5_data_write(train_data, train_label, test_data, test_label, shuffled_flag):
    print("h5py文件正在写入磁盘...")
    
    save_path = "../save_test/" + "train_test_split_data_label_" + shuffled_flag + ".h5"
    with h5py.File(save_path, 'w') as f:
        f.create_dataset('train_data', data=train_data)
        f.create_dataset('train_label', data=train_label)
        f.create_dataset('test_data', data=test_data)
        f.create_dataset('test_label', data=test_label)
    print("h5py文件保存成功!")
def h5_data_read(filename):
    """
        keys() : 获取本文件夹下所有的文件及文件夹的名字
        f['key_name'] : 获取对应的对象
    """
    file = h5py.File(filename,'r')
    train_data = file['train_data'][:]
    train_label = file['train_label'][:]
    test_data = file['test_data'][:]
    test_label = file['test_label'][:]
    return train_data, train_label, test_data, test_label

补充:通过python 读MATLAB数据文件 *.mat

背景

在做deeplearning过程中,使用caffe的框架,一般使用matlab来处理图片(matlab处理图片相对简单,高效),用python来生成需要的lmdb文件以及做test产生结果。

所以某些matlab从图片处理得到的label信息都会以.mat文件供python读取,同时也python产生的结果信息也需要matlab来做进一步的处理(当然也可以使用txt,不嫌麻烦自己处理结构信息)。

介绍

matlab和python间的数据传输一般是基于matlab的文件格式.mat,python中numpy和scipy提供了一些函数,可以很好的对.mat文件的数据进行读写和处理。

在这里numpy作用是提供Array功能映射matlab里面的Matrix,而scipy提供了两个函数loadmat和savemat来读写.mat文件。

下面是一个简单的测试程序

具体的函数用法可以看帮助文档:

import scipy.io as sio 
import matplotlib.pyplot as plt 
import numpy as np 
 
#matlab文件名 
matfn=u'E:/python/测试程序/162250671_162251656_1244.mat' 
data=sio.loadmat(matfn) 
 
plt.close('all') 
xi=data['xi'] 
yi=data['yi'] 
ui=data['ui'] 
vi=data['vi'] 
plt.figure(1) 
plt.quiver( xi[::5,::5],yi[::5,::5],ui[::5,::5],vi[::5,::5]) 
plt.figure(2) 
plt.contourf(xi,yi,ui) 
plt.show()  
sio.savemat('saveddata.mat', {'xi': xi,'yi': yi,'ui': ui,'vi': vi})

示例2

import scipy.io as sio
import numpy as np
 
###下面是讲解python怎么读取.mat文件以及怎么处理得到的结果###
load_fn = 'xxx.mat'
load_data = sio.loadmat(load_fn)
load_matrix = load_data['matrix'] #假设文件中存有字符变量是matrix,例如matlab中save(load_fn, 'matrix');当然可以保存多个save(load_fn, 'matrix_x', 'matrix_y', ...);
load_matrix_row = load_matrix[0] #取了当时matlab中matrix的第一行,python中数组行排列
 
###下面是讲解python怎么保存.mat文件供matlab程序使用###
save_fn = 'xxx.mat'
save_array = np.array([1,2,3,4])
sio.savemat(save_fn, {'array': save_array}) #和上面的一样,存在了array变量的第一行
 
save_array_x = np.array([1,2,3,4])
save_array_y = np.array([5,6,7,8])
sio.savemat(save_fn, {'array_x': save_array_x, 'array_x': save_array_x}) #同理,

鉴于以后的目标主要是利用现有的Matlab数据(.mat或者.txt),主要考虑python导入Matlab数据的问题。以下代码可以解决python读取.mat文件的问题。

主要使用sicpy.io即可。

sicpy.io提供了两个函数loadmat和savemat,非常方便。

# adapted from http://blog.csdn.net/rumswell/article/details/8545087
import scipy.io as sio  
#import matplotlib.pyplot as plt
from pylab import *
import numpy as np   
 
matfn='E:\\Pythonrun\\myuse\\matdata.mat'   # the path of .mat data
data=sio.loadmat(matfn)  
xx=data['matdata']
figure(1)
plot(xx)
show()

以下代码是读入txt数据并转换成数组,方法比较笨,更有效的方法待研究。

from numpy import * 
def file2list(filename):  

    fr = open(filename)  
    array = fr.readlines() #以文件中的每行为一个元素,形成一个list列表  
    num = len(array)  
    returnMat = zeros((num,3))#初始化元素为0的,行号数个列表,其中每个元素仍是列表,元素数是3,在此表示矩阵  
    index = 0   
 
    for line in array:  
        line = line.strip()#去掉一行后的回车符号  
        linelist = line.split(' ')#将一行根据分割符,划分成多个元素的列表  
        returnMat[index,:] = linelist[0:3]#向矩阵赋值,注意这种赋值方式比较笨拙  
        index +=1  
    return returnMat
 
fname = 'E:\\Pythonrun\\myuse\\num_data.txt'
data= file2list(fname)

补充:Python 读写 Matlab Mat 格式数据

1. 非 matlab v7.3 files 读写

import scipy.io as sio
import numpy
# matFile 读取
matFile = 'matlabdata.mat'
datas = sio.loadmat(matFile)
# 加载 matFile 内的数据
# 假设 mat 内保存的变量为 matlabdata
matlabdata = datas['matlabdata']
# matFile 写入
save_matFile = 'save_matlabdata.mat'
save_matlabdata = np.array([1,2,3,4,5])
sio.savemat(save_matFile, {'array':save_matlabdata})

2. matlab v7.3 files 读取

如果 matlab 保存 data 时,采用的是 ‘-v7.3',scipy.io.loadmat函数加载数据会出现错误:

File "/usr/local/lib/python2.7/dist-packages/scipy/io/matlab/mio.py", line 64, in mat_reader_factory
    raise NotImplementedError('Please use HDF reader for matlab v7.3 files')
NotImplementedError: Please use HDF reader for matlab v7.3 files

可以采用:

import h5py
with h5py.File('matlabdata.mat', 'r') as f:
    f.keys() # matlabdata.mat 中的变量名
datas = h5py.File('matlabdata.mat')['matlabdata'].value

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
python局部赋值的规则
Mar 07 Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 Python
详解Python核心对象类型字符串
Feb 11 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
Python列表的切片实例讲解
Aug 20 Python
Python 获取项目根路径的代码
Sep 27 Python
python zip()函数使用方法解析
Oct 31 Python
Python递归调用实现数字累加的代码
Feb 25 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
python利用opencv保存、播放视频
Nov 02 Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
Python-typing: 类型标注与支持 Any类型详解
May 10 #Python
超详细Python解释器新手安装教程
Python机器学习三大件之一numpy
You might like
PHP小教程之实现链表
2014/06/09 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
javascript常用函数(1)
2015/11/04 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
python lambda函数及三个常用的高阶函数
2020/02/05 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
英国最大的奢侈品零售网络商城:Flannels
2016/09/16 全球购物
同程旅游英文网站:LY.com
2018/11/13 全球购物
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
应聘护士自荐信
2013/10/21 职场文书
励志演讲稿300字
2014/08/21 职场文书
蓬莱阁导游词
2015/02/04 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript