Richard Thomas wrote: > On Jun 7, 10:17 am, Peter Otten <__pete...@web.de> wrote: >> Alfred Bovin wrote: >> > I'm working on something where I need to read a (binary) file bit by >> > bit and do something depending on whether the bit is 0 or 1. >> >> > Any help on doing the actual file reading is appreciated. >> >> The logical unit in which files are written is the byte. You can split >> the bytes into 8 bits... >> >> >>> def bits(f): >> >> ... while True: >> ... b = f.read(1) >> ... if not b: break >> ... b = ord(b) >> ... for i in range(8): >> ... yield b & 1 >> ... b >>= 1 >> ...>>> with open("tmp.dat", "wb") as f: # create a file with some example >> data >> >> ... f.write(chr(0b11001010)+chr(0b10101111))>>> with open("tmp.dat", >> "rb") as f: >> >> ... for bit in bits(f): >> ... print bit >> ... >> 0 >> 1 >> 0 >> 1 >> 0 >> 0 >> 1 >> 1 >> 1 >> 1 >> 1 >> 1 >> 0 >> 1 >> 0 >> 1 >> >> but that's a very inefficient approach. If you explain what you are >> planning to do we can most certainly come up with a better alternative. >> >> Peter > > You're reading those bits backwards. You want to read the most > significant bit of each byte first... > > Richard.
>>> def bits(f): ... while True: ... byte = f.read(1) ... if not byte: break ... byte = ord(byte) ... for i in reversed(range(8)): ... yield byte >> i & 1 ... >>> with open("tmp.dat", "rb") as f: ... for bit in bits(f): ... print bit, ... 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 -- http://mail.python.org/mailman/listinfo/python-list