stripping the first byte from a binary file

R

rvr

Would someone mind showing me how to strip the first byte from a
binary file? For some reason I can't figure this out from the binary
file editing examples I've read. Thanks.

~rvr
 
J

Jeremy Sanders

rvr said:
Would someone mind showing me how to strip the first byte from a
binary file? For some reason I can't figure this out from the binary
file editing examples I've read. Thanks.

Do you mean something like this?

f = open('test.dat', 'rb')
f.read(1) # read 1st byte and ignore it
rest = f.read() # read rest

or

data = f.read()
data = data[1:] # skip 1st byte

?
 
R

rvr

rvr said:
Would someone mind showing me how to strip the first byte from a
binary file? For some reason I can't figure this out from the binary
file editing examples I've read. Thanks.

Do you mean something like this?

f = open('test.dat', 'rb')
f.read(1) # read 1st byte and ignore it
rest = f.read() # read rest

or

data = f.read()
data = data[1:] # skip 1st byte

Is there a way to edit the file in place? The best I seem to be able
to do is to use your second solution to read the file into the string,
then re-open the file for writing and put the whole thing back (minus
the first byte). Thanks.

~rvr
 
S

Steven D'Aprano

Is there a way to edit the file in place? The best I seem to be able to
do is to use your second solution to read the file into the string, then
re-open the file for writing and put the whole thing back (minus the
first byte). Thanks.

I don't believe that any of the popular operating systems in common use
(Windows, Linux, Mac, *BSD) have any such functionality.

For safety, you are best off copying the file (minus the first byte) to a
temporary file, then renaming the copy over the original. That way if
your process dies midway through copying the file, you don't lose data.

Renaming the file is atomic under Linux and (probably) Mac, so it is as
safe as possible. Even under Windows, which isn't atomic, it has a
smaller margin for disaster than over-writing the file in place.
 
R

rvr

I don't believe that any of the popular operating systems in common use
(Windows, Linux, Mac, *BSD) have any such functionality.

For safety, you are best off copying the file (minus the first byte) to a
temporary file, then renaming the copy over the original. That way if
your process dies midway through copying the file, you don't lose data.

Renaming the file is atomic under Linux and (probably) Mac, so it is as
safe as possible. Even under Windows, which isn't atomic, it has a
smaller margin for disaster than over-writing the file in place.

Thanks for your response. While searching for solution, I found this:

http://mail.python.org/pipermail/python-list/2001-December/116519.html

Quoting from it:

"""
Replace 2 bytes in place beginning at offset 100 (101st byte):

f = open('text_input', 'r+b')
f.seek(100)
f.write(chr(123) + chr(0x80))
f.seek(0,2)
f.close()
"""

Can I use the seek() and write() methods in a similar way to remove
the first byte? For whatever reason I can't seem to make it work
myself. Thanks again.

~rvr
 
S

Stefan Behnel

rvr said:
Thanks for your response. While searching for solution, I found this:

http://mail.python.org/pipermail/python-list/2001-December/116519.html

Quoting from it:

"""
Replace 2 bytes in place beginning at offset 100 (101st byte):

f = open('text_input', 'r+b')
f.seek(100)
f.write(chr(123) + chr(0x80))
f.seek(0,2)
f.close()
"""

Can I use the seek() and write() methods in a similar way to remove
the first byte? For whatever reason I can't seem to make it work
myself. Thanks again.

Funny. I just happened to read ESR's "how to ask questions the smart way" and
your posts match quite a few of the examples. :)

No, you can't. Steven's solution is what I'd go for.

Stefan
 
A

Alex Popescu

Funny. I just happened to read ESR's "how to ask questions the smart way" and
your posts match quite a few of the examples. :)

No, you can't. Steven's solution is what I'd go for.

Stefan

Forgive my newbie ignorance, but I am wondering why the other method
would not work? I mean it may not be very safe,
but I guess it may perform a lot better, than having to read the whole
file just to cut out the first byte.

TIA,

../alex
 
D

Diez B. Roggisch

Forgive my newbie ignorance, but I am wondering why the other method
would not work? I mean it may not be very safe,
but I guess it may perform a lot better, than having to read the whole
file just to cut out the first byte.

Because seeking is not moving? Shifting data bytewise isn't something that
is supported by the underlying OS filesystems, and thus not supported. But
replacing bytes with others is. Which seek is for.

Diez
 
S

Stefan Behnel

Alex said:
Forgive my newbie ignorance, but I am wondering why the other method
would not work? I mean it may not be very safe,
but I guess it may perform a lot better, than having to read the whole
file just to cut out the first byte.

Why would you expect that? It *might* perform better if there was a system
call for removing bytes from inside a file, as that could reduce the
intermediate space requirements to the size of a hard disk sector rather than
the remaining size of the file (note that the time consumption would not be
reduced significantly, if the remaining file has to be copied around to fill
the sectors). But since that is a rather rare use case that most people would
prefer being handled in a safe rather than space-optimal way, I don't see the
need for such a function.

Stefan
 
A

Alex Popescu

Because seeking is not moving? Shifting data bytewise isn't something that
is supported by the underlying OS filesystems, and thus not supported. But
replacing bytes with others is. Which seek is for.

Diez

As far as I know seek is just about positioning and nothing else.
So, in fact the problem boils down to os support for deleting a bytes.

bests,

../alex
 
D

Diez B. Roggisch

Alex said:
As far as I know seek is just about positioning and nothing else.

It is.
So, in fact the problem boils down to os support for deleting a bytes.

Which there isn't, as I and several others pointed out. And "replacing" is
not removing.

Diez
 
A

Alex Popescu

It is.


Which there isn't, as I and several others pointed out. And "replacing" is
not removing.

Diez

I do agree with your last statement (and it was my mistake to consider
replacing a possible way to remove). Just wanted to
clarify that seek is only for positioning.

bests,

../alex
 

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

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top