我读过here无法就地编辑文件,因为它与操作系统相关且完全独立于语言。这是为什么? C标准fseek()是否定义了就地文件写入?
答案 0 :(得分:3)
您也可以在Python中搜索 - 您链接的答案只是指出您不能插入在文件中间(ABC
- > {{1} })。
如果你搜索然后写,无论写入什么数据都会覆盖文件该位置的内容(ABXC
- > ABC
)。
答案 1 :(得分:1)
关键是文件就像一个数组(只在磁盘上)。它占据磁盘上的固定位置。
如果必须在数组中间插入某些内容,则必须移出尾随元素,否则将覆盖这些元素。同样的概念适用于文件,您需要移出文件的尾部以在中间插入一些东西。
这种情况的一个例外是当您需要使用相同大小的新块覆盖文件的固定大小块时。然后使用fseek()完全没问题,然后只是覆盖。
答案 2 :(得分:1)
问题与操作系统有关,因为它取决于操作系统如何使用其文件系统在磁盘上组织数据。
通常,磁盘被分成固定大小的块来存储文件的内容。当一个字节被覆盖时,只重写包含该字节的(整个)块。当附加文件时,可能重写最后一个块,加上新块被分配并“链接”到文件以存储附加数据的内容。根据该方案,这两项操作是有效的。
但是,当插入或删除某个字节时,通常需要从包含插入/删除更改的第一个块重写该文件。
技术上可以减少重写文件所花费的时间。对于插入情况,OS可以为插入的数据分配新块,将其“链接”到文件,并重写一个或两个相邻块。对于删除情况,OS可以减少块中的有效字节数,重写块,和/或“重新链接”文件中的块。作为免责声明,我刚才提到的“解决方案”取决于特定文件系统的结构。但是,如果您降低了重写文件的成本,通常会在稍后的读取操作中受到影响,或者会发生内部碎片。
如果某人有一天发明了一种允许在磁盘上有效插入/删除数据同时保持读取操作性能的数据结构,那么这个问题可能会得到解决。
答案 3 :(得分:0)
您可以就地修改文件;如果要替换的数据与要替换的数据大小相同(较小,您只需填充)。怎么样呢?那么,修改后的所有内容都需要重写到磁盘上,对吧?在所有情况下,您也不能假设您有足够的空间,因此可能需要将文件移动到一个全新的位置。
显然,这使得有效的用例相当罕见。通常情况下,除非你有充分的理由这样做,否则它是不值得的。至于你是否可以访问Python中的就地修改API ......我不知道。
答案 4 :(得分:0)
当然,您可以编辑文件:
import struct
RECSIZE = struct.calcsize('<i')
fp = open('name.txt', 'r+b')
fp.seek(132 * RECSIZE) # go to record number 132
fp.write(struct.pack('<i', 42))
fp.seek(132 * RECSIZE)
assert struct.unpack('<i', fp.read(RECSIZE)) == 42
这也显示了这样做的最常见原因和限制。