【python】将arff文件转换为mat文件

该博客介绍了如何使用Python将arff数据文件转换为mat文件,适用于在不同环境中使用数据。代码提供了两种方法,通过读取arff文件中@data后面的数据,将其转换为numpy数组并保存为mat文件。
摘要由CSDN通过智能技术生成

【python】将arff文件转换为mat文件

前言

1、arff数据多用于java环境,mat数据多用于matlab环境
2、用记事本打开会发现arff文件前面会有三种描述符@relation、@attribute和@data,一般只需要使用到@data后的数据来训练模型,转换为mat文件也是只需要包含这部分数据。

实现代码

# 2021.07.15 / author: kw-a
import numpy as np
import scipy.io as sio

path = 'E:/workspace/dataset/'  # .arff文件目录
save_path = 'E:/workspace/test/'  # .mat文件保存目录

# 主函数
def main():
    arff_to_mat_one('Forest Covertype', 'FCT')  # filename, mat_name
    # arff_to_mat_two('Forest Covertype', 'FCT')

    # 查看.mat数据
    data = sio.loadmat(save_path + 'FCT' + '.mat')
    print('FCT: ', data)

'''
方法一
读取所有行数据readlines()
创建迭代器进行迭代
'''
def arff_to_mat_one(filename, mat_name):
    dataSet = []
    with open(path + filename + '.arff') as fr:  # 打开读取文件
        Iter = iter(fr.readlines())  # 创建迭代器
        curline = ['0']  # 初始化
        # 迭代到@data结束
        while curline[0] != '@data':
            line = next(Iter)  # 迭代
            curline = line.strip().split(',')
            print(curline)
        print('开始转换{}数据'.format(filename))
        while curline[0]:
            try:
                line = next(Iter)
                if line == '\n':  # 跳过空行
					line = next(Iter)
                curline = line.strip().split(',')  # 去掉首尾空格或换行符
                attrNum = len(curline) - 1  # 属性个数
                fltLine = list(map(float, curline[0:attrNum]))  # 属性值,从下标0读到下标2,不包括下标3,即3个元素,将其转换为浮点数
                label = int((curline[attrNum]))  # 标签 添加最后一个元素
                fltLine.append(label)
                dataSet.append(fltLine)
            except StopIteration:  # next(Iter)迭代结束
                break     
    data_array = np.array(dataSet)
    sio.savemat(save_path + mat_name + '.mat', mdict={mat_name: data_array})  # 转换为.mat文件


'''
方法二
逐行读取readline()
'''
def arff_to_mat_two(filename, mat_name):
    dataSet = []
    with open(path + filename + '.arff') as fr:  # 打开读取文件
        curline = ['0']  # 初始化
        # 迭代到@data结束
        while curline[0] != '@data':
            line = fr.readline()  # 读取一行数据
            curline = line.strip().split(',')
            print(curline)
        print('开始转换{}数据'.format(filename))
        while curline[0]:
            try:
                line = fr.readline()
                if line == '\n':  # 跳过空行
					line = fr.readline()
                curline = line.strip().split(',')  # 去掉首尾空格或换行符
                attrNum = len(curline) - 1  # 属性个数
                fltLine = list(map(float, curline[0:attrNum]))  # 属性值,从下标0读到下标2,不包括下标3,即3个元素,将其转换为浮点数
                label = int((curline[attrNum]))  # 标签 添加最后一个元素
                fltLine.append(label)
                dataSet.append(fltLine)
            except ValueError:  # 迭代结束
                break
    data_array = np.array(dataSet)
    sio.savemat(save_path + mat_name + '.mat', mdict={mat_name: data_array})  # 转换为.mat文件


if __name__ == '__main__':
    main()

对于不包含数据头部介绍信息的arff文件,删除第一个while语句即可

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值