2

我有一个二进制文件,可以在 MATLAB 中打开,但无法在 Python 中打开。二进制文件被编码为“双浮点”,因此 MATLAB 使用以下行读取:

fread(fopen(fileName), 'float64'); 

在 Python 中,我不确定如何复制这一行。我认为使用 Numpy 是一个不错的起点,所以我尝试了以下几行,但没有得到我期望的输出。每行有 6 个数字,我只有第一个和一个“NaN”。

from numpy import * 
f = open('filename', 'rb') 
a = fromfile(f, double64, 10)
print a

对此的任何帮助将不胜感激;我已经在下面的评论中发布了二进制文件和 MATLAB 解析文件。我也不需要专门使用 Numpy,我对任何基于 Python 的解决方案持开放态度。谢谢你。

4

2 回答 2

6

每秒的值都是nan这样,这可能是一些分隔符。此外,文件中的值是列优先的。以下脚本读取数据,丢弃 NaN 条目,将数组操作为正确的形状,并输出与您发布的文件相同的 CSV 文件:

import csv
import numpy as np

# Pull in all the raw data.
with open('TEMPO3.2F-0215_s00116.dat', 'rb') as f:
    raw = np.fromfile(f, np.float64)

# Throw away the nan entries.
raw = raw[1::2]

# Check its a multiple of six so we can reshape it.
if raw.size % 6:
    raise ValueError("Data size not multiple of six.")

# Reshape and take the transpose to manipulate it into the
# same shape as your CSV. The conversion to integer is also
# so the CSV file is the same.
data = raw.reshape((6, raw.size/6)).T.astype('int')

# Dump it out to a CSV.
with open('test.csv', 'w') as f:
    w = csv.writer(f)
    w.writerows(data)

编辑:更新版本与jorgeca建议的更改:

import csv
import numpy as np

# Pull in all the raw data.
raw = np.fromfile('TEMPO3.2F-0215_s00116.dat', np.float64)

# Throw away the nan entries.
raw = raw[1::2]

# Reshape and take the transpose to manipulate it into the
# same shape as your CSV. The conversion to integer is also
# so the CSV file is the same.
data = raw.reshape((6, -1)).T.astype('int')

# Dump it out to a CSV.
with open('test.csv', 'w') as f:
    w = csv.writer(f)
    w.writerows(data)
于 2013-07-17T06:37:31.727 回答
4

在读取时产生交替数据和 NaN 的数据值之间有一个分隔符,例如在 matlab 中:

 NaN
2134
 NaN
2129
 NaN
2128
....
1678

并使用 numpy:

[   nan  2134.    nan ...,  1681.    nan  1678.]

我使用您使用 Matlab 或 numpy(1.7) 发布的代码得到相同的输入。请注意,数据是按列从 dat 文件中读取的,而不是根据 csv 文件中的模式按行读取的。

要获取 numpy 中的所有数据,请尝试

a = fromfile(file=f, dtype=float64, count=-1)
于 2013-07-17T06:33:58.693 回答