Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中对二进制文件进行简单编辑_Python_Binary_Io - Fatal编程技术网

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

在python中对二进制文件进行简单编辑,python,binary,io,Python,Binary,Io,这应该很容易但是我一直找不到这个问题的答案 使用python,我想将一个二进制文件读入内存,修改文件的前四个字节,然后写回文件 必须有一个简单的方法来编辑四个可怜的字节!对吗?简单,但内存效率低 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='

这应该很容易但是我一直找不到这个问题的答案

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


必须有一个简单的方法来编辑四个可怜的字节!对吗?

简单,但内存效率低

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:]
如果文件很大,您可以对其进行内存映射,并编辑/写入需要更改的字节。不过,在他们忘记大约一个梅格之前,几乎没有任何区别。

这应该会有所帮助。


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

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))

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

  • 更改前4个字节不需要将整个文件读入内存
  • 以“r+b”模式打开文件
  • 使用f.seek(0)搜索到起点
  • 使用f.Write('ABCD')写入4个字节的数据
  • 关闭文件

  • 您是想将整个文件读入内存,还是只想在以后修改前四个字节?那么您实际尝试了什么?显示您的最佳尝试,并说出错误所在。“…修改文件的前四个字节,然后将文件写回。”为什么不使用
    f.read(4)
    获取前四个字节,然后在结尾处使用
    f.read()
    完成其余部分。托马斯,我在发布后考虑了这一点,很好。我将其中一个文件复制/粘贴到此文件中,并更改了名称和最后一行:P是否新的前4个字节的值取决于文件的其余内容?我比我更喜欢这个,而且它比mmap更简单。很好。我的问题是使用“w+b”而不是“r+b”作为解决方案。谢谢。很抱歉,mode='a'不可移植,正如手册所说:“'a'用于附加(在某些Unix系统上,这意味着所有写入都附加到文件的末尾,而不考虑当前的查找位置)。”,现在您不需要查找:)是的,但由于我没有提交代码,可以给出一个大致的想法吗?你怎么认为?
    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))
    
    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'
    >>>
    
    with open(filename, 'r+b') as f:
      bytes = f.read(4)
      newbytes = 'demo'
      f.seek(0)
      f.write(newbytes)