用 Python 读取和覆盖一个文件

目前我使用的是:

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

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

183185 次浏览

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

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

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

如果您不想关闭和重新打开文件,以避免竞态条件,您可以 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()

尝试写入一个新的文件. 。

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()

老实说,您可以看看我构建的这个类,它执行基本的文件操作。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)
        

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

例如:

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

对于任何想要按行读取和覆盖的人,请参考这个答案。 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()