Ensuring python equivalence of matlab's `fread`
--------------------------------------------------
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Breezy Bay
--
Chapters
00:00 Ensuring Python Equivalence Of Matlab'S `Fread`
01:07 Accepted Answer Score 6
02:14 Thank you
--
Full question
https://stackoverflow.com/questions/3402...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #matlab #file
#avk47
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Breezy Bay
--
Chapters
00:00 Ensuring Python Equivalence Of Matlab'S `Fread`
01:07 Accepted Answer Score 6
02:14 Thank you
--
Full question
https://stackoverflow.com/questions/3402...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #matlab #file
#avk47
ACCEPTED ANSWER
Score 6
As the comments suggest, you need to use a file descriptor, which is what the Matlab code is doing:
import numpy as np
def fread(fid, nelements, dtype):
if dtype is np.str:
dt = np.uint8 # WARNING: assuming 8-bit ASCII for np.str!
else:
dt = dtype
data_array = np.fromfile(fid, dt, nelements)
data_array.shape = (nelements, 1)
return data_array
fid = open('test.bin', 'rb');
print fread(fid, 2, np.int16)
print fread(fid, 32, np.str)
print fread(fid, 2, np.int16)
Reading & Writing data to a file in binary requires the reader and writer to agree on a specified format. As the commenters suggest, endianess may become an issue if you save the binary on one computer and try to read it on another. If the data is always written and read on the same CPU, then you won't run into the issue.
Output for the test.bin:
MATLAB Output Python+Numpy Output
------------------------------------------------------
ans =
32 [[32]
0 [ 0]]
ans =
35 [[ 35]
32 [ 32]
97 [ 97]
102 [102]
48 [ 48]
52 [ 52]
50 [ 50]
95 [ 95]
53 [ 53]
48 [ 48]
112 [112]
101 [101]
114 [114]
99 [ 99]
95 [ 95]
115 [115]
112 [112]
97 [ 97]
110 [110]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]
32 [ 32]]
ans =
32 [[32]
0 [ 0]]