从 .mat 文件转换为 .txt 文件后文件大小增加

Posted

技术标签:

【中文标题】从 .mat 文件转换为 .txt 文件后文件大小增加【英文标题】:File size increases after converting from .mat files to .txt files 【发布时间】:2016-10-28 13:10:12 【问题描述】:

我有很多 .mat 文件,其中包含有关某些不同波函数的径向部分的信息以及有关原子的其他一些信息。现在我成功提取了波函数部分并使用 numpy.savetxt() 将其保存到 .txt 文件中。但是文件的大小增加了很多: 在我跑完之后

    du -ch wfkt_X_rb87_n=40_L=11_J=0_step=0.001.mat
    440K    wfkt_X_rb87_n=40_L=11_J=0_step=0.001.mat
    du -ch wfkt_X_rb87_n=40_L=12_J=0_step=0.001.txt
    2,9M    wfkt_X_rb87_n=40_L=12_J=0_step=0.001.txt

忽略L=11和L=12的区别,波函数的大小几乎一样,但文件大小增加了6倍以上。我想知道减小 .txt 文件大小的原因和可能的方法。 这是我如何隐藏文件的代码:

    import scipy.io as sio
    import os
    import pickle
    import numpy as np
    import glob as gb
    files=gb.glob('wfkt_X_rb*.mat')
    for filet in files:
            print filet
            mat=sio.loadmat(filet)
            wave=mat['wavefunction'][0]
            J=mat['J']
            L=mat['L']
            n=mat['n']
            xmax=mat['xmax'][0][0]
            xmin=mat['xmin'][0][0]
            xstep=mat['xstep'][0][0]
            energy=mat['energy'][0][0]
            name=filet.replace('.mat','.txt')
            name=name.replace('rb','Rb')
            x=np.linspace(xmin, xmax, num=len(wave), endpoint=False)
            Data=np.transpose([x,wave])
            np.savetxt(name,Data)
            os.remove(filet)
            with open(name, "a") as f:
                    f.write(str(energy)+" "+str(xstep)+"\n")
                    f.write(str(xmin)+" "+str(xmax))

需要的数据文件格式为:

    2.700000000000000000e+01 6.226655250941872093e-04
    2.700099997457605738e+01 6.232789496263042460e-04
    2.700199994915211121e+01 6.238928333406641843e-04
    2.700299992372816860e+01 6.245071764542571872e-04
    2.700399989830422243e+01 6.251219791839867897e-04
    2.700499987288027981e+01 6.257372417466700075e-04
    2.700599984745633364e+01 6.263529643590372287e-04

如果您需要更多信息,请随时询问!提前致谢。

【问题讨论】:

取决于您如何保存它们,可能只是数据类型的更改。您可以添加用于读取/保存它们的代码吗? mat-文件是二进制的,压缩的,而txt文件是,ohm,文本,所以3到6的系数是很正常的。如果大小很重要,请使用像 .mat 这样的二进制格式。 这是意料之中的。文本文件将二进制表示的数字转换为字符。一个简单的例子:数字 2 可以用二进制的两位10 表示,字符“2”是十六进制。 32,即 8 个二进制位(ASCII 格式),因此大 4 倍(Unicode 格式为 16 位)。减少的一种方法是压缩(压缩)txt 文件 - 有许多可用的 python 模块,但您必须解压缩才能使用该文件。大小的减少将取决于数据。 @Benjamin,你知道如何以二进制形式保存数据吗?例如,我可以使用 .dat 文件进行计算。 【参考方案1】:

.mat 是二进制格式,而numpy.savetxt() 写入纯文本文件。双精度数(IEEE 754 双精度)的二进制表示占用 8 个字节。默认情况下,numpy 将其保存为 0.000000000000000000e+00 格式的纯文本,结果为 24 个字节。

有许多额外的效果会影响生成的文件大小。例如。文件格式的结构开销、压缩、用于编写纯文本的格式(十进制位数)。但是,在您的情况下,我怀疑主要影响只是数字的二进制和纯文本表示之间的区别。

如果您想减小文件大小,您应该使用不同的输出格式。可能的选项是:

编写一个压缩文本文件:

import gzip
with open('data.txt.gz', 'wb') as f:
    numpy.savetxt(f, myarray)

再次另存为.mat。见scipy.io.savemat()

编写专有的二进制 numpy 格式 (.npy)。见numpy.save() 编写专有的二进制压缩 numpy 格式 (.npz)。见numpy.savez_compressed() 如果您有大量结构化数据,请考虑使用HDF5 file format。 如果您需要编写自己的二进制格式,请使用 struct.pack() 并将生成的字节写入文件。

选择哪个选项取决于您的情况:之后谁必须读取数据?压缩系数有多重要?您的数据只是一个数组还是结构更复杂?

【讨论】:

你知道如何以二进制格式保存数据吗? 你到底是什么意思?选项 2-5(.mat.npy.npz.hdf5)都是二进制格式。它们只是在数据结构和压缩方面有所不同。 感谢您的回答。处理完文件后,它们将被 C++ 程序读取以进行进一步的计算。在C++程序中,数据应该是2×N数组的格式(当然数据文件本身是以两列的格式保存的)。我想知道是否可以通过再次将数据保存在 .mat 中来减小文件的大小? 以上所有选项都将数据存储在一个缩小的文件中。基本的问题是,你有哪些阅读 C++ 方面的能力。如果您已经有一个可以阅读 .mat 的库,请选择此解决方案。如果没有,但您有一个用于解压缩的库,您可以将选项 1 与压缩的 txt 文件一起使用。或者,使用 .npy 并为该格式实现一个 C++ 阅读器,这相对简单 (docs.scipy.org/doc/numpy/neps/npy-format.html)。

以上是关于从 .mat 文件转换为 .txt 文件后文件大小增加的主要内容,如果未能解决你的问题,请参考以下文章

matlab怎么将mat文件转换成txt文件

matlab中,如何将.txt格式文件转换成.mat格式文件

如何将excel数据文件转换成MATLAB中的.mat文件?

将vector<Mat>转换为矢量文件Opencv

保存MATLAB中间变量值的方法:保存为txt文件或者mat文件

matlab怎么将mat文件转换成txt文件?