Простое редактирование в двоичный файл в Python - PullRequest
5 голосов
/ 05 января 2011

ЭТО ДОЛЖНО БЫТЬ ЛЕГКО! Но я не смог найти ответ на этот вопрос.

Используя python, я хочу прочитать двоичный файл в память, изменить первыйчетыре байта файла, а затем запишите файл обратно.

Должен быть простой способ отредактировать четыре жалких байта!право?

Ответы [ 6 ]

13 голосов
/ 05 января 2011

Зачем читать весь файл, чтобы изменить четыре байта в начале?Разве это не должно работать?

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))
5 голосов
/ 05 января 2011
with open(filename, 'r+b') as f:
  bytes = f.read(4)
  newbytes = 'demo'
  f.seek(0)
  f.write(newbytes)
2 голосов
/ 05 января 2011
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'
>>>
1 голос
/ 05 января 2011

Это очень похоже на HW, поэтому я не буду давать точный код. но здесь достаточно информации

  1. Вам не нужно считывать весь файл в память для изменения первых 4 байтов
  2. Открыть файл в режиме 'r + b'
  3. Используйте f.seek (0), чтобы начать поиск
  4. Запись 4 байтов данных с использованием f.write ('ABCD')
  5. Закрыть файл
1 голос
/ 05 января 2011

Просто, но неэффективно,

Python 3 way:

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

Python 2 way:

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

Если файлы огромные, вы можете отобразить их в памяти и отредактировать / записать только те байты, которые нужно изменить. Тем не менее, почти нет никакой разницы, пока они не превзойдут мег или около того.

0 голосов
/ 05 января 2011

это должно помочь. 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()
...