你不能就地修改文件,至少如果你想在一行中插入字符的话。你只会覆盖下一行的开头。在

有两种不同的方法:将文件读入内存,关闭它,然后写回新版本。在

编写一个新的临时文件,然后将其移到原始版本上。在

那么,你如何在两者之间做出选择呢?我将尝试总结这些差异,并按顺序排列,以便在重要的情况下,每一项通常都胜过下面的(但这只是“典型”-您必须考虑自己的用例):2不需要把整个事情都记在记忆里。如果你的文件是,比如说,20GB,这显然是一个巨大的胜利;如果它是16KB,这无关紧要。

2使整个操作原子化。即使中途失败,或者其他进程试图在您更改文件的过程中读取该文件,也无法让任何人看到无效的半修改文件;他们将看到原始文件或新文件。

2需要一些可用磁盘空间(因为暂时同时有两个文件副本)。

如果您同时关心Windows和POSIX,2将是一个巨大的难题。

如果原始文件和临时目录位于不同的文件系统上,2可能涉及跨文件系统的复制,除非您对此非常小心。

如果以上两个都不是问题,则2更简单。

德雷克金的回答告诉你怎么做。在

如果您不关心Windows或跨文件系统问题,请看以下操作:

infile = open("cache.ucb", 'rb')
outfile = tempfile.NamedTemporaryFile(delete=False)
for line in infile:
if line.split('~!')[0] == ex[4]:
line += "~!" + mask[0]
line = line.rstrip() + "\n"
outfile.write(line)
infile.close()
os.rename(outfile.name, "cache.ucb")
outfile.close()

您可以解决跨文件系统问题,例如,将dir=os.path.dirname(original path)传递给NamedTemporaryFile构造函数,但前提是您确定始终有权在原始文件旁边创建一个新文件(这并不总是保证的,因为您有权重写原始的UNIX权限、Windows acl、OS X沙盒,等等,都会给人以错误的方式)。在