如何用 Python 覆盖文件中间的一些字节?

Posted

技术标签:

【中文标题】如何用 Python 覆盖文件中间的一些字节?【英文标题】:How to overwrite some bytes in the middle of a file with Python? 【发布时间】:2010-10-05 06:30:21 【问题描述】:

我希望能够使用 Python 覆盖文件中给定偏移量处的一些字节。

我的尝试惨遭失败,结果是:

覆盖偏移处的字节,但也截断紧随其后的文件(文件模式=“w”或“w+”) 在文件末尾附加字节(文件模式=“a”或“a+”)

是否可以通过 Python 以可移植的方式实现这一目标?

【问题讨论】:

不是真的,你链接的是关于 inserting 数据和我的是关于 replace 现有数据到位(不重写所有文件内容) . 使用名为 mmap 的模块是您的解决方案。阅读:***.com/questions/125703/… 使用名为 mmap 的模块是您的解决方案。阅读:***.com/questions/125703/… 【参考方案1】:

试试这个:

fh = open("filename.ext", "r+b")
fh.seek(offset)
fh.write(bytes)
fh.close()

【讨论】:

我确认这似乎可行(但不一定适用于 r+ 以外的其他文件模式) @Kena — "r+" 模式特指打开文件进行(读取和)写入,将“指针”留在文件开头,并且不截断。 "a+" 模式也应该适用于此,因为无论如何我们都使用 seek,但其他模式不会。 @Ben Blank:“r+”(更好的是,“r+b”)是这个问题的答案。 “a+”不适用于此。无论寻找什么,用“a”或“a+”打开的文件都会在其末尾附加任何写入内容。 @ΤZΩΤZΙΟΥ — 检查我的笔记 D'oh。你是对的。 :-)【参考方案2】:

非常低效,但我现在不知道还有其他方法,不会覆盖中间的字节(就像 Ben Blanks 所做的那样):

a=file('/tmp/test123','r+')
s=a.read()
a.seek(0)
a.write(s[:3]+'xxx'+s[3:])
a.close()

将在偏移量 3 处写入“xxx”:123456789 --> 123xxx456789

【讨论】:

既然OP问如何覆盖字节,我认为覆盖字节实际上不是问题。 确定吗?引用:我的尝试惨遭失败,导致 [...] 要么覆盖给定偏移量的字节 [...] @Johannes Weiß — 你在好的部分之前删掉了那句话。他在哀叹截断,而不是覆盖。 文件在磁盘上是连续的,因此您不能在不移动文件其余部分的情况下插入文件中间。是的,这是低效的。不过,您的实现可以提高效率 - 您将整个文件读入内存,然后通过连接在内存中创建另一个字符串,该字符串也是文件在写入磁盘之前的大小。这对于大文件/秒来说是个问题。您应该分块循环文件,并通过单独编写部分来避免连接。当您在循环期间达到正确的偏移量时,您将插入您的块。 该方法假定您正在写入不同的文件名。要写入同一个文件,算法会稍微复杂一些——您还需要一个已覆盖的数据缓冲区,您可以写回与您插入的块大小相同的数据。【参考方案3】:

根据this python page,您可以键入file.seek 来寻找特定的偏移量。然后你可以写任何你想要的。

为避免截断文件,您可以使用“a+”打开它,然后寻找正确的偏移量。

【讨论】:

不,答案是以“r+b”开头(二进制,因为我们想覆盖字节)。 “man 3 fopen”,说明部分应该解释可用模式之间的区别。

以上是关于如何用 Python 覆盖文件中间的一些字节?的主要内容,如果未能解决你的问题,请参考以下文章

如何用powermockrunner覆盖循环

如何用角度示意图覆盖文件?

如何用 git push 覆盖,覆盖对 git 服务器的更改?

Objective C 类扩展 - 如何用 readwrite 方法覆盖只读?

如何用python和智能方式覆盖<strong> <em> <u>到<strong>的所有情况?

如何用 0x00 覆盖所有可用磁盘空间? [关闭]