130

目前我正在使用这个:

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

但问题是旧文件比新文件大。所以我最终得到了一个新文件,它的末尾有一部分旧文件。

4

7 回答 7

207

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

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

使用作为上下文管理器,该功能也可能更清洁、更安全open,即使发生错误,它也会关闭文件处理程序!

with open(filename, 'r+') as f:
    text = f.read()
    text = re.sub('foobar', 'bar', text)
    f.seek(0)
    f.write(text)
    f.truncate()
于 2010-03-11T11:16:18.460 回答
21

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

from fileinput import FileInput
for line in FileInput("file", inplace=1):
    line = line.replace("foobar", "bar")
    print(line)
于 2010-03-11T10:08:38.277 回答
16

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

于 2010-03-11T10:04:09.263 回答
1

我发现阅读它然后写它更容易记住。

例如:

with open('file') as f:
    data = f.read()
with open('file', 'w') as f:
    f.write('hello')
于 2020-10-11T18:07:25.027 回答
0

老实说,你可以看看我构建的这个类,它执行基本的文件操作。write 方法覆盖并追加保留旧数据。

class IO:
    def read(self, filename):
        toRead = open(filename, "rb")

        out = toRead.read()
        toRead.close()
        
        return out
    
    def write(self, filename, data):
        toWrite = open(filename, "wb")

        out = toWrite.write(data)
        toWrite.close()

    def append(self, filename, data):
        append = self.read(filename)
        self.write(filename, append+data)
        
于 2020-07-01T20:35:05.410 回答
0

对于想要逐行读取和覆盖的任何人,请参阅此答案。 https://stackoverflow.com/a/71285415/11442980

filename = input("Enter filename: ")
with open(filename, 'r+') as file:
    lines = file.readlines()
    file.seek(0)
    for line in lines:
        value = int(line)
        file.write(str(value + 1))
    file.truncate()
于 2022-02-27T14:13:55.083 回答
-2

尝试将其写入新文件..

f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()
于 2016-06-29T11:59:40.067 回答