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 re模块介绍
Nov 30 Python
Python json模块使用实例
Apr 11 Python
在Django的URLconf中使用命名组的方法
Jul 18 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
python 字典的打印实现
Sep 26 Python
Python中url标签使用知识点总结
Jan 16 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 Python
next在python中返回迭代器的实例方法
Dec 15 Python
用Python爬虫破解滑动验证码的案例解析
May 06 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
Python-typing: 类型标注与支持 Any类型详解
May 10 #Python
超详细Python解释器新手安装教程
Python机器学习三大件之一numpy
You might like
虫族 Zerg 历史背景
2020/03/14 星际争霸
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
Script的加载方法小结
2011/01/12 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
详解python单例模式与metaclass
2016/01/15 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
python中logging库的使用总结
2017/10/18 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
python用列表生成式写嵌套循环的方法
2018/11/08 Python
如何更优雅地写python代码
2019/07/02 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
《狮子和兔子》教学反思
2014/03/02 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js