目前我使用的是:
f = open(filename, 'r+') text = f.read() text = re.sub('foobar', 'bar', text) f.seek(0) f.write(text) f.close()
但问题是旧文件比新文件大。所以我最终得到了一个新文件,它的末端有旧文件的一部分。
也许在 text = re.sub('foobar', 'bar', text)之后关闭文件,重新打开以进行写入(从而清除旧内容)并将更新后的文本写入该文件会更容易和更简洁。
text = re.sub('foobar', 'bar', text)
fileinput模块有一个 inplace模式,用于在不使用临时文件等的情况下对正在处理的文件进行更改。这个模块很好地封装了在文件列表中循环的常见操作,通过一个对象透明地跟踪文件名、行号等,如果你想在循环中检查它们的话。
fileinput
inplace
from fileinput import FileInput for line in FileInput("file", inplace=1): line = line.replace("foobar", "bar") print(line)
如果您不想关闭和重新打开文件,以避免竞态条件,您可以 truncate它:
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作为上下文管理器的 更干净更安全,它将关闭文件处理程序,即使发生错误!
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()