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 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
详解python播放音频的三种方法
Sep 23 Python
postman和python mock测试过程图解
Feb 22 Python
Python类的动态绑定实现原理
Mar 21 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
pandas数据处理之绘图的实现
Jun 15 Python
python实现取余操作的简单实例
Aug 16 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
Python-typing: 类型标注与支持 Any类型详解
May 10 #Python
超详细Python解释器新手安装教程
Python机器学习三大件之一numpy
You might like
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
ajax请求乱码的解决方法(中文乱码)
2014/04/10 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
浅谈js中的bind
2019/03/18 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python进程管理工具supervisor使用实例
2014/09/17 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
简单说明Python中的装饰器的用法
2015/04/24 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
python读取Excel表格文件的方法
2019/09/02 Python
Python虚拟环境venv用法详解
2020/05/25 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
Python分类测试代码实例汇总
2020/07/23 Python
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
幼儿园教师工作感言
2014/02/15 职场文书
大学生英语演讲稿
2014/04/24 职场文书
《悯农》教学反思
2014/04/28 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers