用Python读取并覆盖文件

com*_*pie 95 python file overwrite

目前我正在使用这个:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
Run Code Online (Sandbox Code Playgroud)

但问题是旧文件比新文件大.所以我最终得到一个新文件,其中包含旧文件的一部分.

nos*_*klo 167

如果您不想关闭并重新打开文件,为避免竞争条件,您可以truncate:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
Run Code Online (Sandbox Code Playgroud)

该功能还可以是更清洁和更安全的使用with open as每mVChr的评论,这是将关闭处理,即使发生错误.

with open(filename, 'r+') as f:
    text = f.read()
    text = re.sub('foobar', 'bar', text)
    f.seek(0)
    f.write(text)
    f.truncate()
Run Code Online (Sandbox Code Playgroud)

  • 在此代码中,@ volvox`f.write(text)`在`f.truncate()`之前;它首先写入text,因此在.write()之后,文件光标位于text的末尾。继续截断文件将删除此点之后文件可能剩余的所有字节。在这种情况下,最终结果将与您在写入之前被截断一样。 (2认同)
  • 对于非常大的文件,将整个文件内容读入内存可能会变得很麻烦。因此,[`fileinput`模块](/sf/answers/2286834301/)可以成为首选方法。当传递“inplace=1”时,它会先将文件移动到临时位置,然后将新文件写入旧文件名路径。此移动操作在 UNIX 文件系统上速度很快,因为它只移动文件系统“inode”,而不是完整内容。然后您可以单独读取并处理每一行,以避免内存膨胀。:-) (2认同)

Il-*_*ima 15

关闭文件后可能会更容易和更整洁text = re.sub('foobar', 'bar', text),重新打开它以进行写入(从而清除旧内容),并将更新后的文本写入其中.


gho*_*g74 15

fileinput模块具有一种inline模式,用于将更改写入您正在处理的文件而不使用临时文件等.该模块很好地封装了通过一个透明地跟踪文件名的对象循环遍历文件列表中的行的常见操作,行号等,如果你想在循环内检查它们.

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    if "foobar" in line:
         line=line.replace("foobar","bar")
    print line
Run Code Online (Sandbox Code Playgroud)