How to read/write float values from a binary file in python, if the file was created with C
Question:
I want to read/write C float values from a binary file if it was created in C?
The file was created like this:
#include <stdio.h>
int main() {
const int NUMBEROFTESTELEMENTS = 10;
/* Create the file */
float x = 1.1;
FILE *fh = fopen ("file.bin", "wb");
if (fh != NULL) {
for (int i = 0; i < NUMBEROFTESTELEMENTS; ++i)
{
x = 1.1*i;
fwrite (&x,1, sizeof (x), fh);
printf("%fn", x);
}
fclose (fh);
}
return 0;
}
I found a method like this:
file=open("array.bin","rb")
number=list(file.read(3))
print (number)
file.close()
But this won’t guarantee to me the read value was a C float.
Answers:
import struct
with open("array.bin","rb") as file:
numbers = struct.unpack('f'*10, file.read(4*10))
print (numbers)
This should do the job. numbers
is a tuple
of the 10 values.
If you care about performance, I would suggest using numpy.fromfile for float values reading:
import numpy as np
class FloatReader:
def __init__(self, filename):
self.f = open(filename, "rb")
def read_floats(self, count : int):
return np.fromfile(self.f, dtype=np.float32, count=count, sep='')
This approach is much faster than struct.unpack
in terms of performance!
I want to read/write C float values from a binary file if it was created in C?
The file was created like this:
#include <stdio.h>
int main() {
const int NUMBEROFTESTELEMENTS = 10;
/* Create the file */
float x = 1.1;
FILE *fh = fopen ("file.bin", "wb");
if (fh != NULL) {
for (int i = 0; i < NUMBEROFTESTELEMENTS; ++i)
{
x = 1.1*i;
fwrite (&x,1, sizeof (x), fh);
printf("%fn", x);
}
fclose (fh);
}
return 0;
}
I found a method like this:
file=open("array.bin","rb")
number=list(file.read(3))
print (number)
file.close()
But this won’t guarantee to me the read value was a C float.
import struct
with open("array.bin","rb") as file:
numbers = struct.unpack('f'*10, file.read(4*10))
print (numbers)
This should do the job. numbers
is a tuple
of the 10 values.
If you care about performance, I would suggest using numpy.fromfile for float values reading:
import numpy as np
class FloatReader:
def __init__(self, filename):
self.f = open(filename, "rb")
def read_floats(self, count : int):
return np.fromfile(self.f, dtype=np.float32, count=count, sep='')
This approach is much faster than struct.unpack
in terms of performance!