python覆盖从offset1到offset2的字节

2024-05-03 20:05:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中看过多个教程,对python file write()、tell()、seek()函数以及操作系统写入(),lseek()函数。在

但我还是不知道该怎么做: 我所拥有的: 在一个文件中,我知道起始偏移量和结束偏移量字节。我需要用一组不同的字节来替换从start_offset到end_offset的字节。我该怎么做??在

ftell()返回起始偏移量,类似地regex+ftell()返回结束偏移量 我有将覆盖文件中原始字节的字节。在

但是write()只需要一个字符串来写。另外,如何从起始位置覆盖到结束位置??在

感谢您的任何建议


Tags: 文件函数字节seek教程startregexfile
2条回答

.seek()-返回到start_offset位置之后,将精确的字符数==字节写入。然后覆盖之前的数据。在

您可以将其拆分为多个写入,如果需要,甚至可以一次写入一个字符(字节)。在

尽管你大声否认,你可以在这里使用mmap。在

如果您看一下^{} constructor in the docs,它接受offset和{}的参数。在大多数平台上,两者都必须是PAGESIZE的倍数或类似值,但这并不难。在

所以:

try:
    PAGESIZE = mmap.PAGESIZE
except NameError:
    PAGESIZE = mmap.ALLOCATION_GRANULARITY

def overwrite(fileobj, start, end, newbytes):
    startoffset, startremainder = divmod(start, PAGESIZE)
    offset = startoffset * PAGESIZE
    endoffset, endremainder = divmod(end, PAGESIZE)
    length = (endoffset + 1) * PAGESIZE - offset
    map = mmap.mmap(fileobj.fileno(), offset=offset, length=length,
                    access=mmap.ACCESS_WRITE)
    map[startremainder:startremainder+end-start] = newbytes

这样做的好处是,如果len(newbytes) != end - start你会从mmap得到一个很好的异常,而不是像你所想的那样或多或少地覆盖文件,使文件损坏。在

但是使用seek可能更简单,就像Martijn Pieters的回答一样。以下是与seek相同的函数:

^{pr2}$

不过,值得知道mmap可以做什么,这样您就不会在将来的有用案例中忽略它。在

(另外,对于某些版本的Python,在某些平台上,可能会有太大而无法seek的文件。例如,linux /proc/*/map是一个大小为1<<64的稀疏文件,但是在某些发行版上,Python找不到fseeko,因此不能搜索到比1<<63更远的地方。因此,了解其他方法来做这件事-os.lseekmmap等等-也许有一天能帮助你解决一个问题。)

相关问题 更多 >