Links

Lists

Latest Updates

Ruby On Rails List
Python list
Advanced Java
The JavaScript List
Apache Users
Full Disclosure
Linux Security

Search the archives!


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

How to Read Bytes from a file


  • From: aleax at mac.com (Alex Martelli)
  • Subject: How to Read Bytes from a file
  • Date: Wed, 28 Feb 2007 23:00:26 -0800

gregpinero at gmail.com <gregpinero at gmail.com> wrote:

> It seems like this would be easy but I'm drawing a blank.
> 
> What I want to do is be able to open any file in binary mode, and read
> in one byte (8 bits) at a time and then count the number of 1 bits in
> that byte.
> 
> I got as far as this but it is giving me strings and I'm not sure how
> to accurately get to the byte/bit level.
> 
> f1=file('somefile','rb')
> while 1:
>     abyte=f1.read(1)

You should probaby prepare before the loop a mapping from char to number
of 1 bits in that char:

m = {}
for c in range(256):
  m[c] = countones(c)

and then sum up the values of m[abyte] into a running total (break from
the loop when 'not abyte', i.e. you're reading 0 bytes even though
asking for 1 -- that tells you the fine is finished, remember to close
it).

A trivial way to do the countones function:

def countones(x):
  assert x>=0
  c = 0
  while x:
    c += (x&1)
    x >>= 1
  return c

you just don't want to call it too often, whence the previous advice to
call it just 256 times to prep a mapping.

If you download and install gmpy you can use gmpy.popcount as a fast
implementation of countones:-).


Alex