How do I use the unpack function?

Gary Herron gherron at islandtraining.com
Thu May 15 13:09:45 EDT 2008


John Machin wrote:
> On May 16, 2:11 am, Gary Herron <gher... at islandtraining.com> wrote:
>   
>> Marlin Rowley wrote:
>>     
>>> All:
>>>       
>>> I've got a script that runs really slow because I'm reading from a
>>> stream a byte at a time:
>>>       
>>> // TERRIBLE
>>> for y in range( height ):
>>>         for color in range(4):
>>>             for x in range( width ):
>>>                 pixelComponent = fileIO.read(4)
>>>                 buffer = unpack("!f",pixelComponent)  << unpacks ONE
>>>       
>
> [snip]
> Perhaps the OP might be able to use the Python Imaging Library (PIL)
> instead of reinventing an image-file handler.
>   

Indeed.  That's why my original answer included the line:
    There are probably better ways overall, but this directly answers 
your question.

Other possibilities.

I don't recognize the file format being read in here, but if it is a 
standard image format, the PIL suggestion is a good way to go.

Or, if it is an image of not too enormous size, read the *whole* thing 
in at once. 

Or rather than manipulate the array by carving off 4 bytes at a time, 
just index through it in 4 byte chunks:
  for i in range(width):
      buffer = unpack("!f", pixelComponent[4*i:4*i+4])

Or
  for i in range(0,4*width,4):
      buffer = unpack("!f", pixelComponent[i:i+4])

Or
  Use numpy.  Create an array of floats, and initialize it with the byte 
string, making sure to take endianess int account.  (I'm quite sure this 
could be made to work, and then the whole operation is enormously fast 
with only several lines of Python code and *no* Python loops.

Or
  ...?

Gary Herron

> --
> http://mail.python.org/mailman/listinfo/python-list
>   




More information about the Python-list mailing list