从 .mat 文件转换为 .txt 文件后文件大小增加
File size increases after converting from .mat files to .txt files
我有很多 .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
是二进制格式,而 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() 并将生成的字节写入文件。
选择哪个选项取决于您的情况:之后谁必须读取数据?压缩因子有多重要?您的数据只是一个数组还是结构更复杂?
我有很多 .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
是二进制格式,而 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() 并将生成的字节写入文件。
选择哪个选项取决于您的情况:之后谁必须读取数据?压缩因子有多重要?您的数据只是一个数组还是结构更复杂?