writing numbers in binary file

E

eskandari

Hi,
I am a newbie in python. I have an data.pickle file which is
serialized form of an "array of strings", I want to write their
offsets in another binary file, so an C++ program can read and analyse
them.
But when I try to write offset (number) in binary file, it raise
exception below in line "offsetfile.write(offset)"
"TypeError: argument 1 must be string or read-only buffer, not int"

I search the internet, find that all suggest converting number to
string ---with str()---and then write string to file.
But I shouldn't do this. because the above mentioned C++ function,
read file with this assumption that there are numbers in file.
So I want to know, Is there any way to produce an binary file
containing numbers same as the way C++ does?
Can anybody help me?
Thanks a lot.
 
M

MRAB

eskandari said:
Hi,
I am a newbie in python. I have an data.pickle file which is
serialized form of an "array of strings", I want to write their
offsets in another binary file, so an C++ program can read and analyse
them.
But when I try to write offset (number) in binary file, it raise
exception below in line "offsetfile.write(offset)"
"TypeError: argument 1 must be string or read-only buffer, not int"

I search the internet, find that all suggest converting number to
string ---with str()---and then write string to file.
But I shouldn't do this. because the above mentioned C++ function,
read file with this assumption that there are numbers in file.
So I want to know, Is there any way to produce an binary file
containing numbers same as the way C++ does?
Can anybody help me?
You can't write ints to a file, but you can write bytestrings ('str' in
Python 2, 'bytes' in Python 3).

Use the 'struct' module to convert the int to a bytestring, and remember
to open the file as a binary file.
 
T

Tim Chase

But when I try to write offset (number) in binary file, it raise
exception below in line "offsetfile.write(offset)"
"TypeError: argument 1 must be string or read-only buffer, not int"

I search the internet, find that all suggest converting number to
string ---with str()---and then write string to file.
But I shouldn't do this. because the above mentioned C++ function,
read file with this assumption that there are numbers in file.
So I want to know, Is there any way to produce an binary file
containing numbers same as the way C++ does?

Well, you have at least two options:

1) use the pack/unpack functions in the "struct" module to
convert a number to a byte representation that you can then write
to a file

2) write the number to the file as a string and then use C++
libraries to parse a number from a string.

In both cases, you have to consider what happens when the number
is outside the bounds of your C++ data-type (you don't mention
what you're using...an int, a long, or "long long"; signed vs.
unsigned). Additionally in the first case, you have to make sure
that your memory-architecture (big-endian vs. little-endian)
matches on both sides; or that you marshal the data through a
pre-defined format (in libraries, commonly called "network"
format). For such reasons, I'd stick with method #2 unless you
have a strong reason not to.

-tkc
 
E

eskandari

You can't write ints to a file, but you can write bytestrings ('str' in
Python 2, 'bytes' in Python 3).

Use the 'struct' module to convert the int to a bytestring, and remember
to open the file as a binary file.

Thanks alot,
I have an question, if I do so, Will the second program (C++ program)
which process this file, encounter any problem while parsing the file?
It find number of integers by filelen/4 and ..... (It assumes that
file was created as the same way which C++ does)
Thanks in advance
 
T

Terry Reedy

Thanks alot,
I have an question, if I do so, Will the second program (C++ program)
which process this file, encounter any problem while parsing the file?
It find number of integers by filelen/4 and ..... (It assumes that
file was created as the same way which C++ does)

Tim Chase pretty well answered this. If you are not familiar with the
problem of 'endianess', see
http://en.wikipedia.org/wiki/Endianess
 
D

Dave Angel

eskandari said:
Thanks alot,
I have an question, if I do so, Will the second program (C++ program)
which process this file, encounter any problem while parsing the file?
It find number of integers by filelen/4 and ..... (It assumes that
file was created as the same way which C++ does)
Thanks in advance
You talk as if C++ has a single way to write a file, or read a file. It
has dozens of possibilities, as does Python. In another message, you
refer to four bytes per number, so it's possible you're talking about
reading directly from the file into an int variable. If you know that
the C++ program is reading a file in mode 'b' directly to an unsigned
int, and is compiled in 32 bits, and has the same endian-ness as the
Python program, chances are the struct will work correctly, if you're
running Python under the same conditions.

DaveA
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top