目前我正在使用它:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
但问题是旧文件比新文件大。所以我最终得到了一个新文件,其中包含旧文件的一部分。
答案 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()