4
\$\begingroup\$

I wrote a python function that writes a integer to a file in binary form. But are there any ways that I can reduce the number of steps, is there a more efficient way to write a integer to a file?

def IntWrite(FileName, Integer):
    #convert to hexadecimal
    data = str('{0:0x}'.format(Integer))
    #pad number if odd length
    if(len(data) % 2 != 0):
        data="0"+data
    #split into chucks of two
    info = [data[i:i+2] for i in range(0, len(data), 2)]
    #convert each chuck to a byte
    data2 = "".join([chr(int(a, 16)) for a in info])
    #write to file
    file(FileName, "wb").write(data2)


#convert back to integer
def IntRead(FileName):
    RawData = file(FileName, "rb").read()
    HexData = "".join(['{0:0x}'.format(ord(b)) for b in RawData])
    return int(HexData, 16)


IntWrite("int_data.txt", 100000)
print IntRead("int_data.txt")
\$\endgroup\$
3
  • 2
    \$\begingroup\$ This is more of a SO question. See struct.pack, struct.unpack, in this case with a format character of i or I, unless you need more than 32 bits. \$\endgroup\$ Nov 13 '13 at 3:02
  • \$\begingroup\$ … but it's also acceptable as a Code Review question. \$\endgroup\$ Nov 13 '13 at 5:58
  • \$\begingroup\$ Sure, especially if there is a need to handle arbitrarily large integers, which the original code seems to offer. Otherwise the best code is that which you don't have to write. :) \$\endgroup\$ Nov 13 '13 at 13:16
2
\$\begingroup\$

Python comes with a built-in pickle module for serialization:

>>> import pickle
>>> with open('data', 'wb') as f: pickle.dump(9 ** 33, f)
>>> with open('data', 'rb') as f: print(pickle.load(f))
30903154382632612361920641803529

(P.S. I wouldn't use a filename ending with .txt to store binary data.)

\$\endgroup\$
2
  • 1
    \$\begingroup\$ Note that pickle's binary format is incompatible with the original question. \$\endgroup\$ Nov 13 '13 at 15:51
  • \$\begingroup\$ Yes, that's right: I'm assuming here that the OP is starting from scratch. \$\endgroup\$ Nov 13 '13 at 15:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.