在Python中读取和覆盖文件

在Python中读取和覆盖文件,python,file,overwrite,Python,File,Overwrite,目前我使用的是: 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)重新打开文件进行写入(从而清除旧内容)之后,关闭该文件可能会更容易、更整洁,并将更新后的文本写入其中。该模

目前我使用的是:

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)
重新打开文件进行写入(从而清除旧内容)之后,关闭该文件可能会更容易、更整洁,并将更新后的文本写入其中。

该模块有一个
就地
模式,用于在不使用临时文件等的情况下将更改写入正在处理的文件。该模块通过一个透明跟踪文件名的对象,很好地封装了在文件列表中的行上循环的常见操作,如果要在回路内检查,请使用线号等

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

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

该功能可能还将使用
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)
        

我发现读了然后再写更容易记住

例如:

打开('file')作为f的
:
data=f.read()
将open('file','w')作为f:
f、 写(‘你好’)

我想清楚一点-你的第二个剪辑是否应该在
f.truncate()
之后有
f.write(text)
?@volvox
f.write(text)
f.truncate()之前;它首先写入
文本
,因此在
.write()之后
文件光标位于
文本
的末尾。继续截断该文件将删除该文件在此点之后可能具有的任何剩余字节。在这种情况下,最终结果将与写入之前被截断的结果相同。对于非常大的文件,将整个文件内容读入内存可能会变得非常笨拙。因此,该方法可以成为首选方法。当传递
inplace=1
时,它将首先将文件移动到临时位置,然后将新文件写入旧文件名路径。这种移动操作在unix文件系统上很快,因为它只移动文件系统
inode
,而不是全部内容。然后您可以分别读取和处理每一行,以避免内存膨胀。:-)
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)