How can I Read/Write multiple sequential Binary/Text data files

A

Albert Tu

Dear there,

We have an x-ray CT system. The acquisition computer acquires x-ray
projections and outputs multiple data files in binary format (2-byte
unsigned integer) such as projection0.raw, projection1.raw,
projection2.raw ... up to projection500.raw. Each file is
2*1024*768-byte big.

I would like to read those files and convert to ascii files in %5.0f/n
format as projection0.data ... projection500.data so that our
visualization software can undersatnd the projection images. I was
trying to do this conversion using Python. However, I had troubles
declaring the file names using the do-loop index. Anyone had previous
experience?

Thanks,
Albert
 
C

Christos TZOTZIOY Georgiou

Dear there,

We have an x-ray CT system. The acquisition computer acquires x-ray
projections and outputs multiple data files in binary format (2-byte
unsigned integer) such as projection0.raw, projection1.raw,
projection2.raw ... up to projection500.raw. Each file is
2*1024*768-byte big.

I would like to read those files and convert to ascii files in %5.0f/n
format as projection0.data ... projection500.data so that our
visualization software can undersatnd the projection images. I was
trying to do this conversion using Python. However, I had troubles
declaring the file names using the do-loop index. Anyone had previous
experience?

Regular expressions could help, but if you *know* that these are the filenames,
you can (untested code):

PREFIX= "projection"
SUFFIX_I= ".raw"
SUFFIX_O= ".data"

import glob, struct

for filename in glob.glob("%s*%s" % (PREFIX, SUFFIX_I)):
number= filename[len(PREFIX):-len(SUFFIX_I)]
fpi= open(filename, "rb")
fpo= open("%s%s%s" % (PREFIX, number, SUFFIX_O), "w")
while 1:
datum= fpi.read(2)
if not datum: break
fpo.write("%5d\n" % struct.unpack("H", datum)) # check endianness!!!
fpi.close()
fpo.close()
 
J

John Machin

Regular expressions could help, but if you *know* that these are the filenames,
you can (untested code):

PREFIX= "projection"
SUFFIX_I= ".raw"
SUFFIX_O= ".data"

import glob, struct

import array

DIFFERENT_ENDIAN = True/False
for filename in glob.glob("%s*%s" % (PREFIX, SUFFIX_I)):
number= filename[len(PREFIX):-len(SUFFIX_I)]
fpi= open(filename, "rb")
fpo= open("%s%s%s" % (PREFIX, number, SUFFIX_O), "w")
while 1:
datum= fpi.read(2)
if not datum: break
fpo.write("%5d\n" % struct.unpack("H", datum)) # check endianness!!!

If the OP knows that each input file is small enough (1.5Mb each as
stated), then the agony of file.read(2) can be avoided by reading the
whole file in one hit. The agony of struct.unpack() on each datum can
be avoided by using the array module. E.g. replace the whole 'while'
loop by this:

ary = array.array('H', fpi.read())
if DIFFERENT_ENDIAN:
ary.byteswap()
for datum in ary:
fpo.write("%5d\n" % datum)

Even if the input files were too large to fit in memory, they could
still be processed fast enough by reading a big chunk at a time.
 
B

Bengt Richter

Dear there,

We have an x-ray CT system. The acquisition computer acquires x-ray
projections and outputs multiple data files in binary format (2-byte
unsigned integer) such as projection0.raw, projection1.raw,
projection2.raw ... up to projection500.raw. Each file is
2*1024*768-byte big.

I would like to read those files and convert to ascii files in %5.0f/n
format as projection0.data ... projection500.data so that our
visualization software can undersatnd the projection images. I was
Is there no chance of fixing the visualization software instead? The format seems
easy and efficient, and it seems a shame to make a redundant bloated copy
of the same info. What next? XML tags surrounding your ascii floats?

What platform are you on? What is the visualization software's method of
accessing data? Only files as you describe? Are you visualizing interactively,
or setting up batch processing?
trying to do this conversion using Python. However, I had troubles
declaring the file names using the do-loop index. Anyone had previous
experience?
Are you the same person who posted re this format some time ago?

Regards,
Bengt Richter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top