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

时间:2016-06-26 12:10:47

标签: python numpy filesize file-type mat

我有很多.mat文件,其中包含有关某些不同波函数的径向部分的信息以及有关原子的一些其他信息。现在我成功提取了wavefunction部分并使用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

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

1 个答案:

答案 0 :(得分:3)

.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()并将结果字节写入文件。

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