Python-对大型文件的小更改

Python-对大型文件的小更改,python,Python,这是一个理论问题,因为我没有实际问题,但我想知道 如果我有一个很大的文件,比如说很多Gig长的文件,我想改变一个字节,我知道那个字节的偏移量,我怎么能有效地做到这一点?有没有一种方法可以做到这一点,而不重写整个文件,只写入单个字节 在Python文件api中,我没有看到任何允许我写入文件中特定偏移量的内容 您可以将seek()搜索到一个位置并写入一个字节。它将覆盖其中的内容,而不是插入内容。查找文件中的该位置并写入一个字节。Python中的文件对象有一个seek方法,该方法接受某个常量的整数偏移

这是一个理论问题,因为我没有实际问题,但我想知道

如果我有一个很大的文件,比如说很多Gig长的文件,我想改变一个字节,我知道那个字节的偏移量,我怎么能有效地做到这一点?有没有一种方法可以做到这一点,而不重写整个文件,只写入单个字节


在Python文件api中,我没有看到任何允许我写入文件中特定偏移量的内容

您可以将seek()搜索到一个位置并写入一个字节。它将覆盖其中的内容,而不是插入内容。

查找文件中的该位置并写入一个字节。Python中的文件对象有一个seek方法,该方法接受某个常量的整数偏移量:

seek(offset[, whence])

whence参数是可选的,默认为0(绝对文件定位);其他值为1(相对于当前位置的搜索)和2(相对于文件结尾的搜索)。

以下是一个很好的教程,介绍了可能需要执行的操作:


“seek”是查找所需字节的方法。上面的链接介绍了需要注意的事项

只要不需要插入或删除字节,就可以在
“r+”
模式下打开文件,使用该方法将文件对象定位在要更改的字节处,然后写出一个字节

使用不进行任何应用程序级缓冲的低级操作可能更有效


如果您确实需要插入或删除字节,很抱歉,您运气不好:如果不重写整个文件(从第一次插入或删除时开始),就无法做到这一点。这是POSIX(以及AFAIK和Windows)低级文件API的限制,而不是Python的限制。

啊,好吧,与此相关,如果我想插入呢?在每种情况下(插入/更改),是重写整个文件还是只写入一个字节?或者这仅仅取决于fs?Unix(包括OSX)和Windows(AFAIK)都不提供系统调用来插入或删除大文件中的字节,而不从第一次更改开始重写整个文件。您可以使用seek()、write()、flush()设置光标位置以保存更改。当然,您只需要从编辑点写入文件,而不是整个文件?答案很好。非常感谢!但是你的意思是重写“从第一次更改的角度”而不是整个文件吗?我只是从下面引用你们的评论。是的,你们都是对的,我只是简化了一点。(以原子方式替换文件的标准技术包括制作完整副本,所以人们通常只是这样做。)真的吗?如果我有5GB的文件和1gb的ram呢?这在共享主机等上的日志或在笔记本电脑上修改视频/音频流中很常见。你不会把东西载入记忆。你不能。将更改写入磁盘。