Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write individual bits to a text file in python?

Tags:

python

file-io

Suppose I have a number like 824 and I write it to a text file using python. In the text file, it will take 3 bytes space. However, If i represent it using bits, it has the following representation 0000001100111000 which is 2 bytes (16 bits). I was wondering how can I write bits to file in python, not bytes. If I can do that, the size of the file will be 2 bytes, not 3. Please provide code. I am using python 2.6. Also, I do not want to use any external modules that do not come with the basic installation I tried below and gave me 12 bytes!

a =824;
c=bin(a)
handle = open('try1.txt','wb')
handle.write(c)
handle.close()
like image 475
Programmer Avatar asked Mar 05 '11 17:03

Programmer


People also ask

How to write a string to a text file in Python?

The following illustrates how to write a string to a text file: To write to a text file in Python, you follow these steps: First, open the text file for writing (or appending) using the open () function. Second, write to the text file using the write () or writelines () method. Third, close the file using the close () method.

How to write bytes to a file in Python?

Let us see how to write bytes to a file in Python. First, open a file in binary write mode and then specify the contents to write in the form of bytes. Next, use the write function to write the byte contents to a binary file. In the above example, we opened a file in binary write mode and then wrote some bytes contents as bytes in the binary file.

How do you append to a text file in Python?

Append to a text file To write to a text file in Python, you have to use the open () and write () functions. The open () function takes two parameters: file name and file access mode. The returned value of open () is the file object.

How to write a quote from a text file in Python?

' with open ( 'quotes.txt', 'w', encoding= 'utf-8') as f: f.write (quote) Use the open () function with the w or a mode to open a text file for appending. Always close the file after completing writing using the close () method or use the with statement when opening the file.


3 Answers

The struct module is what you want. From your example, 824 = 0000001100111000 binary or 0338 hexadecimal. This is the two bytes 03H and 38H. struct.pack will convert 824 to a string of these two bytes, but you also have to decide little-endian (write the 38H first) or big-endian (write the 03H first).

Example

>>> import struct
>>> struct.pack('>H',824) # big-endian
'\x038'
>>> struct.pack('<H',824) # little-endian
'8\x03'
>>> struct.pack('H',824)  # Use system default
'8\x03'

struct returns a two-byte string. the '\x##' notation means (a byte with hexadecimal value ##). the '8' is an ASCII '8' (value 38H). Python byte strings use ASCII for printable characters, and \x## notation for unprintable characters.

Below is an example writing and reading binary data to a file. You should always specify the endian-ness when writing to and reading from a binary file, in case it is read on a system with a different endian default:

import struct

a = 824
bin_data = struct.pack('<H',824)
print 'bin_data length:',len(bin_data)

with open('data.bin','wb') as f:
    f.write(bin_data)

with open('data.bin','rb') as f:
   bin_data = f.read()
   print 'Value from file:',struct.unpack('<H',bin_data)[0]

print 'bin_data representation:',repr(bin_data)
for i,c in enumerate(bin_data):
    print 'Byte {0} as binary: {1:08b}'.format(i,ord(c))

Output

bin_data length: 2
Value from file: 824
bin_data representation: '8\x03'
Byte 0 as binary: 00111000
Byte 1 as binary: 00000011
like image 81
Mark Tolonen Avatar answered Sep 21 '22 23:09

Mark Tolonen


Have a look at struct:

>>> struct.pack("h", 824)
'8\x03'
like image 23
Joril Avatar answered Sep 23 '22 23:09

Joril


I think what you want is to open the file in binary mode:

open("file.bla", "wb")

However, this will write an integer to the file, which will probably be 4 bytes in size. I do not know if Python has a 2 byte integer type. But you can circumvent that by encoding 2 16 bit number in one 32 bit number:

a = 824
b = 1234
c = (a << 16) + b
like image 35
Björn Pollex Avatar answered Sep 23 '22 23:09

Björn Pollex