在python中简单编辑二进制文件

时间:2011-01-05 00:30:55

标签: python binary io

这应该很容易!但我一直无法找到这个问题的答案。

使用python,我想将二进制文件读入内存,修改文件的前四个字节,然后将文件写回。

必须有一种简单的方法来编辑四个字节!正确?

6 个答案:

答案 0 :(得分:13)

为什么要读取整个文件以在开头更改四个字节?这不应该起作用吗?

with open("filename.txt", "r+b") as f:
     f.write(chr(10) + chr(20) + chr(30) + chr(40))

即使你需要从文件中读取这些字节来计算新值,你仍然可以这样做:

with open("filename.txt", "r+b") as f:
    fourbytes = [ord(b) for b in f.read(4)]
    fourbytes[0] = fourbytes[1]  # whatever, manipulate your bytes here
    f.seek(0)
    f.write("".join(chr(b) for b in fourbytes))

答案 1 :(得分:5)

with open(filename, 'r+b') as f:
  bytes = f.read(4)
  newbytes = 'demo'
  f.seek(0)
  f.write(newbytes)

答案 2 :(得分:2)

C:\junk>copy con qwerty.txt
qwertyuiop
^Z
        1 file(s) copied.

C:\junk>\python27\python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('qwerty.txt', 'r+b')
>>> f.write('asdf')
>>> f.close()
>>> open('qwerty.txt', 'rb').read()
'asdftyuiop\r\n'
>>>

答案 3 :(得分:1)

简单地说,但记忆效率低下,

Python 3方式:

def binaryedit(fn):
 f=open(fn,mode='rb')
 fc=f.read()
 f.close()
 return b'rawr'+fc[4:]

Python 2方式:

def binaryedit(fn):
 f=open(fn,mode='rb')
 fc=f.read()
 f.close()
 return 'rawr'+fc[4:]

如果文件很大,你可以对内存进行映射,然后编辑/编写需要更改的字节。但是,直到他们超过一兆左右才会有任何差别。

答案 4 :(得分:1)

这看起来很像HW,所以我不会给出确切的代码。 但这里有足够的信息

  1. 您无需将整个文件读入内存以更改前4个字节
  2. 以模式' r + b'
  3. 打开文件
  4. 使用f.seek(0)寻找开头
  5. 使用f.write(' ABCD')
  6. 写入4个字节的数据
  7. 关闭文件

答案 5 :(得分:0)

这应该有所帮助。 http://www.johnny-lin.com/cdat_tips/tips_fileio/bin_array.html

import Numeric as N import array

num_lon = 144 num_lat = 73 tmpfile = "tmp.bin"

fileobj = open(tmpfile, mode='rb') binvalues = array.array('f') binvalues.read(fileobj, num_lon * num_lat)

data = N.array(binvalues, typecode=N.Float)

data = N.reshape(data, (num_lat, num_lon))

fileobj.close()