用Python读取并覆盖文件

时间:2010-03-11 10:01:43

标签: python file overwrite

目前我正在使用它:

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

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

6 个答案:

答案 0 :(得分:160)

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

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

每个mVChr的注释使用with open as功能也可能cleaner and safer,即使发生错误也会关闭处理程序。

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

答案 1 :(得分:15)

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

答案 2 :(得分:14)

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

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

答案 3 :(得分: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)
        

答案 4 :(得分:0)

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

例如:

with open('file') as f:
    data = f.read()
with open('file', 'w') as f:
    f.write('hello')

答案 5 :(得分:-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()